20

我刚开始玩 Doctrine ORM 库,并且正在学习表之间的所有关联。

所以我坚持单向和双向关系的差异。

据我了解,单向关系仅在一侧具有主键,而那一侧是拥有侧,对吗?并且双向关系在两个表中都有主键,因此您可以从两侧建立关系,并在两侧设置约束。

现在,我正在阅读有关关系的 Doctrine 文档,并且您有: 单向双向关联。

但是它们生成相同的 SQL,以及具有相同主键和约束的相同表。所以我真的看不出这两者有什么区别。两个例子的一侧都有主键。

据我所知,真正的双向关系应该在两个表中都有指向另一个表的主键,对吗?并且在 Doctrine 文档中给出的示例并非如此。这两个例子给出了相同的结果并且是相同的。

所以我所做的是,假设我有用户和卡实体,并且希望关系是 OneToOne 双向的。

    /**
 * @Entity
 * @Table(name="users")
 */

class User
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="Card", mappedBy="User")
     * @JoinColumn(name="card_id", referencedColumnName="id")
     */
    protected $card;

    /**
     * @Column(name="user_name", type="string")
     */
    protected $userName;

    /**
     * @Column(name="user_pass", type="string")
     */
    protected $userPass;
}

    /**
 * @Entity
 * @Table(name="cards")
 */

class Card
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="User", inversedBy="Card")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    /**
     * @Column(name="post_title", type="string")
     */
    protected $cardType;
}

这里的区别是我在两个对象/实体中都写了@JoinColumn。在教义示例中只有一个。现在我会得到我认为的双向关系。如果我查看 EER 图,我可以看到一条线从用户指向卡,另一条从卡指向用户。

所以基本上我做对了吗?教义文档有错吗?:D 双向 OneToOne 关系如何在 EER 图中显示?

谢谢!

4

2 回答 2

19

唯一的区别在于 PHP 类接口,即是否存在指向所有者的$customer属性(例如,在提到的 Doctrine 示例中的属性)。换句话说,Doctrine 只需要知道它应该关注单个属性 ( $shipping) 还是两个属性 ( $cartand $customer)。没有其他区别。因此,SQL 代码是相同的(因为一个外键足以表示任何 1:N 关系)并且在 EER 图中也没有区别(因为在 EER 中您通常不会解决此类与 PHP 相关的实现细节)。

于 2012-10-16T20:05:12.137 回答
12

单向和双向与后台算法如何在数据库层创建这些连接无关。

他们谈论的只是如何使用这些连接。在单向关系中,您只能从一个站点访问目标。双向关系允许从两个(双方)调用连接。

所以在一个unidir。相对。model_a 可以到达 model_b,但 model_b 无法到达 model_a(无需额外工作)。如果您现在使用 bidir。rel 两个模型可以毫无问题地相互访问

在教义术语中,单向关系定义了一个 $modelA->getModelB()方法,但不是一个$modelB->getModelA()方法,而双向关系定义了两种方法(或访问器,但是你想调用它们)

在 uml 图中,它看起来像这样:

unidirectional
modelA --X------> modelB

bidirectional
modelA <--------> modelB
于 2012-10-10T13:24:46.440 回答