需要帮助了解一对多的教义

Posted

技术标签:

【中文标题】需要帮助了解一对多的教义【英文标题】:Need help understanding Doctrine one to many 【发布时间】:2010-07-18 05:52:48 【问题描述】:

引用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。它有什么作用?我读它的方式是......

用户与电话号码存在多对多关系 它使用连接表users_phonenumbers users_phonenumbers.user_id = users.id users_phonenumbers.phonenumber_id = Phonenumber.id 我猜unique 会以某种方式限制多对多对多对一的关系。但是你怎么解释呢?同样在 SQL 意义上(输出是什么样的)?

【问题讨论】:

【参考方案1】:

映射转换为以下 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();

这将引发唯一约束异常,您不能将相同的电话号码添加到不同的用户,因为电话号码是唯一的(在数据库级别)。

【讨论】:

嗯等等,从 SQL 来看,phonenumber 不会在表 User_phonenumber 上唯一吗?从 sql 中,我解释为,1 个用户可以有很多电话号码,但 1 个电话号码只能用于 1 个用户,因为它对 table 不是 database 是唯一的? 正确,这就是一对多的含义。一个用户有很多电话号码,很多电话号码有一个用户。无论如何只能有一个电话号码,因为 ID 是一个主键,它始终是唯一的。但是,您仍然可以将唯一的电话号码与许多用户联系起来,除非 phonenumber_id 在多对多 JoinTable 上也是唯一的。【参考方案2】:

唯一约束确保一列或一组列中包含的数据是 独一无二。

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

P.

【讨论】:

以上是关于需要帮助了解一对多的教义的主要内容,如果未能解决你的问题,请参考以下文章

关于与查询构建器的“一对多”关系的教义内连接

教义没有在教义上创建一对多关系:模式:更新

Zend 2 - 教义如何为三个实体插入一对多?

Hibernate一对多实例

了解一对多的核心数据删除规则

Hibernate 中一对一、多对一和一对多的默认获取类型