我正在尝试在通过ManyToMany
关联创建的数据透视表上添加唯一列。
我发现这个page of the documentation解释了如何使用此示例在某些列上生成数据库唯一约束:
/**
* @Entity
* @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
*/
class ECommerceProduct
{
}
但这只有在我通过第三个实体创建数据透视表时才有效,在我的情况下,我使用ManyToMany关系创建了数据透视表(与this code的方式相同)。 / p>
是否可以在使用ManyToMany
的同时在数据透视表上添加唯一列,还是需要依赖第三个实体?
答案 0 :(得分:2)
虽然@Table
注释提出了uniqueConstraints
选项,但@JoinTable
却没有。因此,如果要在关联表上添加唯一约束,则必须实际创建另一个实体。
话虽这么说,默认连接表不需要比Doctrine设置的默认配置更多的东西。目前,在添加ManyToMany
关联时,连接表由两个字段组成,并且创建了依赖于这两个字段的复合主键。
如果您的关联表仅包含引用关联双方的两个基本字段(如果使用@ManyToMany
则必然如此),复合主键应该是您所需要的。
以下是User
与ManyToMany
(from this section of the documentation)Group
关联的基本示例生成的SQL:
CREATE TABLE users_groups (
user_id INT NOT NULL,
group_id INT NOT NULL,
PRIMARY KEY(user_id, group_id)
) ENGINE = InnoDB;
ALTER TABLE users_groups ADD FOREIGN KEY (user_id) REFERENCES User(id);
ALTER TABLE users_groups ADD FOREIGN KEY (group_id) REFERENCES Group(id);
正如您所看到的,所有内容都使用复合主键进行了正确设置,这样可确保情侣(user_id, group_id)
无法重复输入。
答案 1 :(得分:0)
当然还有另一种选择,艾伦!
如果您需要零到零的关系,则唯一的选择是在汇总表中为每个pk定义唯一约束,以使理论确定约零到零的关系。
问题在于,教义的人民没有考虑零到零的关系,因此,唯一的替代方法是对每个pk具有一个唯一约束的多体关系。
如果您对E-R模型的理论实现的最终状态有疑问,我强烈建议您使用mysql-workbench-schema-exporter。使用此php工具,您可以轻松地将mysql工作台E-R模式导出到Doctrine的工作类模式,这样您就可以轻松地探索所有替代方法;-)
希望这会有所帮助