繁体   English   中英

单向与双向的一对一关系

[英]unidirectional vs bidirectional in one-to-one relationship

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

我有这些表:

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

学生 - > id,user_id,fname,lname

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

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

他们有什么不同?

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

Doctrine docs 在这里说, 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-to-one-unidirectional

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

“Doctrine docs在这里说,Doctrine只会检查一个协会的拥有方面是否有变化。这意味着什么?有什么样的变化?”

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

例如:

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

正如我告诉你的那样,我没有测试过这种情况,因为我通常会很好地宣布我的关系(你的FK将定义哪个是所有者方,在这种情况下是User)。 无论如何,进行测试并确认它并不困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM