删除级联中的实体不能在ManyToMany关系中工作

时间:2014-12-16 14:27:07

标签: php mysql symfony doctrine

我有一个父实体类别和一个子实体文章。它们由ManyToMany关系定义。一篇文章可以在一个或多个类别中进行分类,每个类别都可以在多个文章中进行标记。

我想做什么
我希望当我删除一个类别时,类别中标记的每个文章也会被删除,但前提是它们没有被其他类别标记。

我已经测试过什么
我测试了2个类别(id = 1和id = 2)和两篇文章(id = 71和id = 91)。 第71条同时具有第1类和第2类。第91条仅与第2类相关。
因此,在删除第2类时,我希望删除第91条但不删除第71条(因为这一条仍然与category_1相关联)

但这一切都没有发生在我试过的任何事情......

以下图片 中,我总结了我使用不同策略得到的结果(1 / cascade = {“remove”},2 / orphanRemoval = true和3 / ondelete =“CASCADE”)。
绿色 中从数据库中删除。

enter image description here

我的代码(代码的一部分)

控制器中的

public function deleteCategory(Category $category)
{
  $em = $this->getDoctrine()->getManager();
  $em->remove($category);
  $em->flush();
}
策略1的

/ cascade = {“删除”}

 // IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
 * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories",  cascade={ "remove"})
 private $articles;

 // IN CLASS/ENTITY ARTICLE 
 * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
 private $categories;
策略2的

/ orphanRemoval = true

 // IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
 * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories",  orphanRemoval=true)
 private $articles;

 // IN CLASS/ENTITY ARTICLE 
 * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
 private $categories;

for strategy 3 / onDelete =“CASCADE”

 // IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
 * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories")
 private $articles;

 // IN CLASS/ENTITY ARTICLE 
 * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
 * @ORM\JoinColumn(onDelete="CASCADE")

 private $categories;

我的问题

还有其他一些方法吗,但我已经尝试过的3种策略或者那些删除操作必须在控制器中完成?

1 个答案:

答案 0 :(得分:0)

就我想象的那样,你不能只使用级联功能。

一个干净的解决方案是创建一个订阅preRemove事件的侦听器。 然后,您可以检查何时删除某个类别,并查找该类别中没有任何其他类别的所有文章,并将其删除。