我开始玩Doctrine ORM库,我正在学习表之间的所有关联。
所以我坚持单向和双向关系的差异。
正如我所知,单向关系只在一侧有主键,而那边是拥有右侧的? 并且双向关系在两个表中都有主键,因此您可以从两侧获得关系,并在两侧设置约束。
现在,我正在阅读关于关系的Doctrine文档,你有: Unidirectional和Bidirectional个关联。
但它们生成相同的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。在Doctrine示例中,只有一个。 现在我会得到我认为的双向关系。如果我看一下EER图,我可以看到一条线从用户到卡,另一条从卡到用户。
所以基本上我做对了吗? Doctrine文档是错的吗? :d 双向OneToOne关系如何在EER图中看到?
谢谢!
答案 0 :(得分:14)
唯一的区别在于PHP类接口,即存在或不存在指向所有者的属性(例如,在所提到的Doctrine示例中的$customer
属性)。换句话说,Doctrine只需要知道它是应该关注单个属性($shipping
)还是两个属性($cart
和$customer
)。没有其他区别。因此,SQL代码是相同的(因为一个外键足以表示任何1:N关系)并且EER图也没有区别(因为在EER中,您通常不能解决此类与PHP相关的实现细节)。 / p>
答案 1 :(得分:10)
单向和双向与后台算法无关,如何在数据库层中创建这些连接。
他们所谈论的是如何使用连接。在单向关系中,您只能从一个站点访问目标。双向关系允许从两个(两个)侧调用连接。
所以在一个unidir。相对。 model_a可以到达model_b,但是model_b无法进入model_a(没有额外的工作)。 如果你现在使用bidir。两个模型可以相互访问而没有问题
在学说条款中,单向关系定义了一个
$modelA->getModelB()
方法,但不是$modelB->getModelA()
方法,而双向关系定义了两种方法(或访问者,但是你想要调用它们)
看起来像这样:
unidirectional
modelA --X------> modelB
bidirectional
modelA <--------> modelB