【问题标题】:Doctrine - OneToOne Unidirectional vs OneToOne BidirectionalDoctrine - OneToOne 单向 vs OneToOne 双向
【发布时间】:2012-09-28 15:31:49
【问题描述】:

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

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

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

现在,我正在阅读有关关系的 Doctrine 文档,您有: UnidirectionalBidirectional 关联。

但它们生成相同的 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 图中看起来如何?

谢谢!

【问题讨论】:

    标签: php orm doctrine doctrine-orm relational-database


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      unidirectional
      modelA --X------> modelB
      
      bidirectional
      modelA <--------> modelB
      

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 2013-08-19
        • 1970-01-01
        相关资源
        最近更新 更多