当一部分为空时,Symfony 删除 ManyToMany 相关对象?

我正在尝试删除未使用的标签。虽然 Post 和 Tag 之间的关系已经被删除,但 post-linked 标签并没有被删除。


“orphanRemoval”不起作用,因为它已全部删除。级联“删除”不删除。


发布实体:


class Post implements \JsonSerializable

{

   /**

    * @ORM\ManyToMany(targetEntity="App\Entity\Cms\PostTag", inversedBy="posts", cascade={"persist", "remove"})

    * @ORM\JoinTable(name="post_tag_taxonomy")

    * @Assert\Count(max="5")

    */

    private $tags;

}

标记实体:


class PostTag {

    /**

     * @ORM\ManyToMany(targetEntity="App\Entity\Cms\Post", mappedBy="tags")

     */

     private $posts;

}

这是一个类似的示例,但适用于 Java。


慕村9548890
浏览 142回答 2
2回答

慕哥6287543

我建议您使用Doctrine 生命周期回调preUpdate中的事件。在更新帖子时,您告诉教义检查是否有标签更改(在这种情况下为 NULL),如果是,则查询标签检查是否有任何帖子仍在使用它。简而言之,您需要:在您的课程之前添加 @ORM\HasLifecycleCallbacks 以启用生命周期。在 Post 类中添加 preUpdate 功能:    /**     * @ORM\PreUpdate     * @param PreUpdateEventArgs $event     */    public function clearChangeSet(PreUpdateEventArgs $event)    {        if ($event->hasChangedField('field_you_want_to_check')         ) {            $em = $event->getEntityManager();            // Now use the entityManager to query the tag and check.        }    }通过执行此原则将为您进行检查,在逻辑代码中您只需要执行取消链接,无需关心删除标签。

慕妹3242003

解决方案:/** * @ORM\PostUpdate() */public function postUpdate(LifecycleEventArgs $args){    /** @var PersistentCollection $tags */    $tags = $args->getEntity()->getTags();    if ($tags->isDirty() && ($deleted = $tags->getDeleteDiff())) {        $em = $args->getEntityManager();        foreach ($deleted as $tag) {            if ($tag->getPosts()->count() === 1) {                $em->remove($tag);                $em->flush($tag);            }        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP