[英]Doctrine - OneToOne Unidirectional vs OneToOne Bidirectional
我開始玩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;
}
這里的區別是我在兩個對象/實體中都寫了@JoinColumn。 在Doctrine示例中,只有一個。 現在我會得到我認為的雙向關系。 如果我看一下EER圖,我可以看到一條線從用戶指向卡,另一條線從卡指向用戶。
所以基本上我做對了嗎? Doctrine文檔是錯的嗎? :D如何在EER圖中看到雙向OneToOne關系?
謝謝!
唯一的區別在於PHP類接口,即存在或不存在指向所有者的屬性(例如,在所提到的Doctrine示例中的$customer
屬性)。 換句話說,Doctrine只需要知道它是應該關注單個屬性( $shipping
)還是兩個屬性( $cart
和$customer
)。 沒有其他區別。 因此,SQL代碼是相同的(因為一個外鍵足以表示任何1:N關系)並且在EER圖中也沒有區別(因為在EER中,您通常不能解決此類與PHP相關的實現細節)。
單向和雙向與后台算法無關,如何在數據庫層中創建這些連接。
他們所談論的是如何使用連接。 在單向關系中,您只能從一個站點訪問目標。 雙向關系允許從兩個(兩個)側調用連接。
所以在unidir。 相對。 model_a可以到達model_b,但是model_b無法進入model_a(沒有額外的工作)。 如果你現在使用bidir。 兩個模型可以相互訪問而不會出現問題
在學說術語中,單向關系定義$modelA->getModelB()
方法,但不定義$modelB->getModelA()
方法,而雙向關系定義兩種方法(或訪問者,但是你想要調用它們)
在uml圖中,它看起來像這樣:
unidirectional
modelA --X------> modelB
bidirectional
modelA <--------> modelB
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.