一对一关系中的单向与双向



我在阅读Doctrine文档时遇到了这些概念,并感到困惑。

我有这些表格:

用户->id,角色,电子邮件,用户名,密码

学生->id,user_id,fname,lname

教师->id,user_id,fname,指定

user_id是Users表中的外键。那么,这应该是单向关系还是双向关系呢?

它们有什么不同?

有人能为两者提供真实世界的例子吗?

Doctrine在这里说,Doctrine只会检查协会的所有者是否有变化这是什么意思?什么样的变化?

通常,您可以随时使用单向或双向关系。你设计代码是因为你要使用它。例如,如果你声明单向关系oneToOne是因为你只需要把信息放在一边。相反,如果您需要从两个实体访问有关另一个实体的信息,则需要声明您的双向关系。例如:

假设您的关系用户教师是OneToOne。

案例1:您需要知道用户是否是教师,还需要知道哪个用户与教师实体相关=>您使用双向关系。

/** @Entity */
class User
{
// ...
/**
* @OneToOne(targetEntity="Teacher", mappedBy="user")
*/
private $teacher;
// ...
}
/** @Entity */
class Teacher
{
// ...
/**
* @OneToOne(targetEntity="User", inversedBy="teacher")
* @JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
// ...
}

默认表格看起来像

CREATE TABLE Teacher (
id INT AUTO_INCREMENT NOT NULL,
user_id INT DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE User (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Teacher ADD FOREIGN KEY (user_id) REFERENCES User(id);

情况2:你需要访问教师相关的用户,但你永远不需要知道哪些用户是教师,所以你只声明教师端的一部分。

参考:http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#one-到一个单向

有一些限制,主要是在一对多关系中。一般来说,我会建议您使用双向关系。

"条令文件在这里说,条令只会检查协会的拥有方是否有变化。这意味着什么?什么样的变化?">

我不完全确定这一点,但我可以告诉你我对此的理解:当你在实体中刷新你的更改时(在更改了它们上的某个内容并执行$entityManager->flush()之后),它只会从关系中的主要实体检查你的更改,也就是说,如果你在另一个实体中更改了某个内容,它不会同时检查这两个实体,只会检查关系中的主实体。因此,你必须声明作为所有者的那一方是"基础",而不是相反。例如,在前面的例子中,如果您将用户实体从教师实体更改为教师实体,则Doctrine不会将其考虑在内,因为用户是所有者。

例如:

$teacher->getUser()->setName('john'); //Doctrine won't check for this change
$user->getTeacher()->setStatus('dismissed'); //Doctrine will track this change

正如我告诉你的,我还没有测试过这种情况,因为我通常很好地声明了我的关系(你的FK将定义哪一方是所有者,在本例中是用户)。无论如何,做一个测试并确认它并不困难。

相关内容

  • 没有找到相关文章