【问题标题】:deleting entities in cascade not working in ManyToMany relation级联删除实体在多对多关系中不起作用
【发布时间】:2015-02-14 21:31:15
【问题描述】:

我有一个父实体类别和一个子实体文章。它们由 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 ="级联")。
绿色从数据库中删除。

我的代码(部分代码)

在控制器中

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

对于策略 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;

对于策略 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;

对于策略 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 种策略或者必须在控制器中完成这些删除之外,还有其他方法吗?

【问题讨论】:

    标签: php mysql symfony doctrine


    【解决方案1】:

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

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

    【讨论】:

    • ok Waaghals 我会尝试事件或者可能直接在控制器中执行(直接在控制器中执行没有错吗??)
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多