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

Ale*_*s_D 6 php mysql doctrine symfony

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

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

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

但是,无论我尝试过什么,这都不会发生......

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

在此输入图像描述

我的代码(部分代码)

在控制器中

public function deleteCategory(Category $category)
{
  $em = $this->getDoctrine()->getManager();
  $em->remove($category);
  $em->flush();
}
Run Code Online (Sandbox Code Playgroud)

for strategy 1/cascade = {"remove"}

 // 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;
Run Code Online (Sandbox Code Playgroud)

对于策略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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

我的问题

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

Waa*_*als 1

据我所知,您不能仅使用级联功能来做到这一点。

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