我知道在SO上也有类似的问题,但是我没有找到答案。
当我尝试删除一个类EntityA
的一个实体,该实体与另一个类EntityB
具有oneToMany关联,并且有一个EntityB
与EntityA
关联时,我得到以下信息错误:
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配置为通过NULL
设置将该关系的拥有方的外键设置为cascade
。但是我认为,因为我在 not-owning-side 上使用它,所以它不起作用。但是我不确定是否是这种情况。
编辑:实际上,我不确定如果在所有者侧设置了层叠:分离选项,该怎么办。也许我缺少对学说要领的理解...
我知道有一些SQL触发器(可以对删除事件等进行操作),还有一种配置原则来配置它们的方法,但是我想将该逻辑保留在我的应用程序代码中。
由于性能原因,我还希望避免迭代集合,检查是否设置了关联,然后将它们设置为NULL
。
我在做什么错?如何避免抛出错误?
以下是实体类中的两个相关映射定义:
EntityA
class EntityA {
/**
* @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"detach"})
*/
private $entityBs;
}
EntityB
class EntityB {
/**
* @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entityB")
*/
private $entityA;
}
答案 0 :(得分:1)
尝试以下方法:
/**
* @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"remove"})
*/
protected $entityBs;
和
/**
* @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entityB")
* @ORM\JoinColumn(name="entityA_id", referencedColumnName="entityB_id", nullable=true, onDelete="SET NULL")
*/
protected $entityA;