2012-10-08 86 views
14

我开始与Doctrine ORM库一起玩,我也学习了表之间的所有关联。学说 - OneToOne单向与OneToOne双向

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

当我得到它时,单向关系仅在一侧具有主键,而这一侧是拥有一侧的权利? 而双向关系在这两个表中都有主键,因此你可以在双方都有关系,并且在双方都设置约束。

现在,我读通过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 Bidirectional OneToOne关系如何在EER图中查看?

谢谢!

+0

有人吗?没有人? :d – otporan

回答

12

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

9

单向和双向无关如何在数据库层中创建这些连接的背景算法。

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

所以在一个unidir。相对。 model_a可以到达model_b,但是model_b不能进入model_a(没有额外的工作)。 如果您现在使用bidir。相对这两种模式之间可以互相访问没有问题

在理论方面,单向关系,定义了一个 $modelA->getModelB()方法,但不是$modelB->getModelA()方法,而双向关系定义了两种方法(或存取,但是你想打电话给他们)

在UML图它是这样

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

bidirectional 
modelA <--------> modelB