在Doctrine

时间:2018-02-27 19:36:31

标签: doctrine-orm

我正在尝试在通过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的同时在数据透视表上添加唯一列,还是需要依赖第三个实体?

2 个答案:

答案 0 :(得分:2)

虽然@Table注释提出了uniqueConstraints选项,但@JoinTable却没有。因此,如果要在关联表上添加唯一约束,则必须实际创建另一个实体。

话虽这么说,默认连接表不需要比Doctrine设置的默认配置更多的东西。目前,在添加ManyToMany关联时,连接表由两个字段组成,并且创建了依赖于这两个字段的复合主键。

如果您的关联表仅包含引用关联双方的两个基本字段(如果使用@ManyToMany则必然如此),复合主键应该是您所需要的。

以下是UserManyToManyfrom this section of the documentationGroup关联的基本示例生成的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的工作类模式,这样您就可以轻松地探索所有替代方法;-)

希望这会有所帮助