2012-10-08 139 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