需要帮助理解一对一的Doctrine

时间:2010-07-18 05:52:48

标签: php sql orm doctrine

引用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 个答案:

答案 0 :(得分: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();

这会抛出一个唯一的约束异常,你不能向不同的用户添加相同的phonenumber,因为phonenumbers是唯一的(在数据库级别上)。

答案 1 :(得分:0)

唯一约束可确保列或列组中包含的数据 唯一的。

请注意,两个空值不被视为相等,因此您可以存储两个或更多个重复行。主键已经是唯一的,因此您不需要使用主键列。 :)

P上。