gpt4 book ai didi

php - Doctrine - OneToOne 单向与 OneToOne 双向

转载 作者:IT王子 更新时间:2023-10-29 00:17:14 28 4
gpt4 key购买 nike

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

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

据我所知,单向关系只有一侧有主键,那一侧是拥有一侧,对吧?双向关系在两个表中都有主键,因此您可以从两边都有关系,并在两边设置约束。

现在,我正在阅读有关关系的 Doctrine 文档,你有: UnidirectionalBidirectional协会。

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

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

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

    /**
* @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。在 Doctrine 例子中只有一个。现在我会得到我认为的双向关系。如果我查看 EER 图,我可以看到一条线从用户指向卡,另一条线从卡指向用户。

基本上我做对了吗?Doctrine 文档有误吗? :D双向 OneToOne 关系在 EER 图中看起来如何?

谢谢!

最佳答案

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

关于php - Doctrine - OneToOne 单向与 OneToOne 双向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12780765/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com