【问题标题】: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 意义上(输出是什么样的)?

【问题讨论】:

    标签: php sql orm doctrine


    【解决方案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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 2016-05-03
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多