需要帮助了解一对多的教义
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.
【讨论】:
以上是关于需要帮助了解一对多的教义的主要内容,如果未能解决你的问题,请参考以下文章