簡體   English   中英

Doctrine - OneToOne單向與OneToOne雙向

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM