如何使用Doctrine更新另一个表中删除行上的表行?

时间:2019-06-07 11:29:17

标签: mysql doctrine-orm

我的实体“ A”具有以下属性:

manyToOne:
    b:
        targetEntity: App\Entity\B
        joinColumn:
            name: b_id
            referencedColumnName: id

当立即删除实体“ B”时,如何更新实体“ A”的值?

例如:

$a = new A();
$b = $bRepository->find(1);
$a->setB($b);
$em->persist($a);
$em->flush();

// table a:         table b:
// +----+------+    +----+
// | id | b_id |    | id |
// +----+------+    +----+
// |  1 |    1 |    |  1 |
// +----+------+    +----+

$em->remove($b);
$em->flush();

// table a:         table b:
// +----+------+    +----+
// | id | b_id |    | id |
// +----+------+    +----+
// |  1 | NULL |
// +----+------+

我可以使用MySQL触发器来做到这一点,但是也许有一些表或原则的配置可以不使用触发器来做到这一点?

主要问题是我无法修改实体“ B”或使用删除了“ B”上的$a->setB(null); $em->persist($a);来更新实体“ A”,因为它在共享包中并在多个项目中使用

1 个答案:

答案 0 :(得分:0)

找到了我之前没有注意到的解决方案:MySQL "ON DELETE" referential action的值为“ SET NULL”。参见小提琴:http://sqlfiddle.com/#!9/49e79b/1

ALTER TABLE a ADD FOREIGN KEY (b_id) REFERENCES b (id) ON DELETE SET NULL ON UPDATE CASCADE;
manyToOne:
    b:
        targetEntity: App\Entity\B
        joinColumn:
            name: b_id
            referencedColumnName: id
            onDelete: SET NULL