2010-07-18 56 views
0

引用doctrine reference - one to many unidirectional需要幫助理解學說一對多

class User 
{ 
    // ... 

    /** 
    * @ManyToMany(targetEntity="Phonenumber") 
    * @JoinTable(name="users_phonenumbers", 
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="phonenumber_id", referencedColumnName="id", unique=true)} 
    *  ) 
    */ 
    private $phonenumbers; 

    // ... 
} 

的一部分,我不明白的是unique=true。它有什麼作用?我看事情是這樣的......

  • 用戶有很多與Phonenumber來許多關係
  • 它使用的連接表users_phonenumbers
  • users_phonenumbers.user_id = users.id
  • users_phonenumbers.phonenumber_id = Phonenumber.id
  • 我猜unique做某種程度上限制了多對多到多對一的關係。但你如何解釋它?同樣在SQL意義上(輸出是什麼樣的)?

回答

2

映射轉換爲下列SQL表(假設兩個擁有代理ID,名爲id):

CREATE TABLE User (id INT(10) PRIMARY KEY) 
CREATE TABLE Phonenumber (id INT(10) PRIMARY KEY) 
CREATE TABLE User_Phonenumber (
    user_id INT(10), 
    phonenumber_id INT(10), 
    PRIMARY KEY (user_id, phonenumber_id), 
    UNIQUE(phonenumber_id) 
); 

這意味着在代碼方面:

$phonenumber = new Phonenumber(); 
$phonenumber->setNumber("123-4567890"); 
$user1->addPhonenumber($phonenumber); 
$user2->addPhonenumber($phonenumber); 
$entityManager->flush(); 

這會拋出一個唯一的約束異常,因爲電話號碼是唯一的(在數據庫級別),所以不能爲不同的用戶添加相同的電話號碼。

+0

hmm等待,從SQL,不會''phonenumber'唯一的表'User_phonenumber'表?從sql中,我解釋爲,1個用戶可以有多個phonenumbers,但1個phonenumber可以爲1個用戶,因爲它唯一的**表** **不** **數據庫**? – 2010-07-19 07:40:47

+0

是正確的,這是一對多的意思。一個用戶有很多電話號碼,許多電話號碼有一個用戶。 無論如何,只能有一個phonenumber,因爲ID是一個主鍵,它總是唯一的。 但是,您仍然可以將唯一的phonenumber連接到許多用戶,除非phonenumber_id在多對多JoinTable中也是唯一的。 – beberlei 2010-07-19 12:50:13

0

獨特的約束條件確保包含在一列或一組列中的數據是唯一的,即 。

請注意,兩個空值不會相等,因此您可以存儲兩個或多個重複行。主鍵已經是唯一的,所以你不需要使用主鍵列。 :)

P.

+0

在示例的上下文中,哪些列將是唯一的? – 2010-07-18 12:48:17