otp*_*ran 16 php orm doctrine relational-database doctrine-orm
我开始玩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;
}
Run Code Online (Sandbox Code Playgroud)
这里的区别是我在两个对象/实体中都写了@JoinColumn.在Doctrine示例中,只有一个.现在我会得到我认为的双向关系.如果我查看EER图,我可以看到一条线从用户到卡,另一条从卡到用户.
所以基本上我做对了吗?Doctrine文档是错的吗?:D如何在EER图中看到双向OneToOne关系?
谢谢!
rad*_*ovo 14
唯一的区别在于PHP类接口,即存在或不存在指向所有者的$customer属性(例如,在所提到的Doctrine示例中的属性).换句话说,Doctrine只需要知道它是应该关注单个property($shipping)还是两个属性($cart和$customer).没有其他区别.因此,SQL代码是相同的(因为一个外键足以表示任何1:N关系)并且EER图也没有区别(因为在EER中,您通常不解决此类与PHP相关的实现细节).
Cri*_*iss 10
单向和双向与后台算法无关,如何在数据库层中创建这些连接.
他们所谈论的是如何使用连接.在单向关系中,您只能从一个站点访问目标.双向关系允许从两个(两个)侧调用连接.
所以在unidir.相对.model_a可以到达model_b,但是model_b无法进入model_a(没有额外的工作).如果你现在使用bidir.两个模型可以相互访问而不会出现问题
在学说术语中,单向关系定义$modelA->getModelB()方法,但不定义
$modelB->getModelA()方法,而双向关系定义两种方法(或访问者,但是要调用它们)
在uml图中,它看起来像这样:
unidirectional
modelA --X------> modelB
bidirectional
modelA <--------> modelB
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9538 次 |
| 最近记录: |