我知道SO上有类似的问题,但我没有找到答案。
当我尝试删除与另一个类EntityB
具有 oneToMany 关联的类EntityA
的实体并且有一个与EntityA
关联的EntityB
时,我收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`example_table`.`entity_b`, CONSTRAINT `FK_CAC822D9B8F92CD8` FOREIGN KEY (`entity_a_id`) REFERENCES `entity_a` (`id`))
(我将真实实体名称更改为EntityA
和EntityB
(
我尝试配置 Doctrine 以将该关系的拥有端的外键设置为通过cascade
设置进行NULL
。但我认为,因为我在非拥有方使用它,所以它不起作用。但我不确定情况是否如此。
编辑:事实上,如果将级联:分离选项设置为拥有方,我真的不确定它应该做什么。也许我缺少对教义要点的一些理解......
我知道有SQL触发器(可以对删除事件等进行操作(以及一种配置原则以配置它们的方法,但我想将该逻辑保留在我的应用程序代码中。
我还希望避免迭代集合,检查是否设置了关系,然后由于性能原因将它们设置为NULL
。
我做错了什么?如何避免抛出的错误?
下面是实体类中的两个相关映射定义:
实体 A
class EntityA {
/**
* @ORMOneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"detach"})
*/
private $entityBs;
}
实体B
class EntityB {
/**
* @ORMManyToOne(targetEntity="EntityA", inversedBy="entityB")
*/
private $entityA;
}
试试下面:
/**
* @ORMOneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"remove"})
*/
protected $entityBs;
和
/**
* @ORMManyToOne(targetEntity="EntityA", inversedBy="entityB")
* @ORMJoinColumn(name="entityA_id", referencedColumnName="entityB_id", nullable=true, onDelete="SET NULL")
*/
protected $entityA;