使用级联从Query Builder中删除Doctrine

时间:2015-01-09 10:59:24

标签: php symfony doctrine-orm cascade

我有两个由ManyToOne关系链接的实体。 我们称他们为ParentChild;父母可以有多个孩子。

我在关系上定义了cascade={"persist", "remove"}。当我使用$em->remove($parent);方法时,它似乎有效。

但事实是我必须一次删除很多父母(例如超过3,000)。为了进行批量删除,Doctrine建议直接使用QueryBuidler中的delete方法:

#ParentRepository
$qb = $this->createQueryBuilder('p')
           ->delete();
$qb->getQUery()->execute();

但是当我尝试时,我收到以下错误: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails [...]

使用delete()时似乎没有遵循删除级联。

对此有何帮助?

1 个答案:

答案 0 :(得分:1)

尝试在实体onDelete="SET NULL"的注释中添加选项Child。例如:

class Parent {
/**
*@ORM\OneToMany(targetEntity="Child", mappedBy="parent")
*/
protected $childs;
}

class Child {
/**
* @ORM\ManyToOne(targetEntity="Parent", inversedBy="childs")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $parent;
}