使用教义

时间:2018-10-24 10:47:45

标签: php doctrine relational-database

我知道在SO上也有类似的问题,但是我没有找到答案。

当我尝试删除一个类EntityA的一个实体,该实体与另一个类EntityB具有oneToMany关联,并且有一个EntityBEntityA关联时,我得到以下信息错误:

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`))

(我将真实实体名称更改为EntityAEntityB

我尝试将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;
}

1 个答案:

答案 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;