为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕村9548890 2022-01-24 13:09:39
我正在尝试删除未使用的标签。虽然 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。
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

我建议您使用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.

        }

    }

通过执行此原则将为您进行检查,在逻辑代码中您只需要执行取消链接,无需关心删除标签。



查看完整回答
反对 回复 2022-01-24
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

解决方案:


/**

 * @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);

            }

        }

    }

}


查看完整回答
反对 回复 2022-01-24
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信