【发布时间】:2015-04-20 00:39:13
【问题描述】:
对于多对多关系(例如组和用户),一旦删除任何一个实体,联合表中的行就会自动删除,就像为关系设置了级联删除属性一样。所以基本上我想删除它如果它是空的。所以解决方案必须保证没有关系被丢弃(就像 FK 约束保证它一样)。
是否可以默认不这样做并在违反外键约束时抛出异常?
PS:删除前检查不是解决方案,因为它很容易出现竞争条件。
PPS:映射定义是微不足道的,为了完整起见,我将它们发布在这里(即使它们没有带来任何有用的东西)
PPPS:onDelete: cascade 也不是解决方案:它在数据库级别创建相应的ON DELETE CASCADE。
PPPPS:ON DELETE RESTRICT 不能使用,因为学说将从联合表中删除所有引用。
在角色中:
manyToMany:
users:
targetEntity: UserAccount
mappedBy: roles
在用户中:
manyToMany:
roles:
targetEntity: Role
joinTable:
name: user_role
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
role_id:
referencedColumnName: id
【问题讨论】:
-
我认为数据库级别的
ON DELETE RESTRICT也不是一个选项? -
选择什么?我不想从联合表中删除任何内容。
-
也许我不理解最初的问题,但是如果您想在尝试删除外键引用的行时抛出异常,您可以在 DB 中设置 ON DELETE RESTRICT。然后这会简单地从 DB 中抛出一个异常。
-
@awons 原则会从联合表中一一删除行,因此永远不会使用
ON DELETE RESTRICT。 -
Doctrine 默认没有一对多的级联删除。所以你可以使用第三类,比如
Definition,默认不会被删除。
标签: php database symfony doctrine-orm doctrine