2010-07-18 22 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