加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 当在Doctrine MongoDB中删除该对象时,如何删除对象的任何

发布时间:2020-12-13 22:33:29 所属栏目:PHP教程 来源:网络整理
导读:我的页面上出现以下严重错误 The "WildkatProxyDocumentsTagProxy" document with identifier "4e90eede17bc2ec68c000001" could not be found. 我假设这是因为文档标记代理已从其他操作中删除,因此引用不再有效.我现在想要删除对这个对象的陈旧引用,但是要
我的页面上出现以下严重错误

The "WildkatProxyDocumentsTagProxy" document with identifier "4e90eede17bc2ec68c000001" could not be found.

我假设这是因为文档标记代理已从其他操作中删除,因此引用不再有效.我现在想要删除对这个对象的陈旧引用,但是要静默. (因为这可能会在很多其他情况下发生)无论如何,当删除对象时,我是否可以对引用已删除对象的所有对象执行“反向级联”?

完成此任务的最佳做法是什么?

谢谢
安迪

解决方法

我假设您有两个集合,ArticleTag和Article,其中的文章引用了文章标签.如果要在删除标记时从文章中删除标记引用,则可以实现事件侦听器.

创建一个类:
????

namespace FooBarBundleEventListener;

use DoctrineODMMongoDBEventLifecycleEventArgs;
use FooBarBundleDocumentArticle;

class ArticleTagRemovalListener
{
    public function preRemove(LifecycleEventArgs $args)
    {
        $document = $args->getDocument();

        if ($document instanceof Article) {
            // Remove tag from all articles
            $args
                ->getDocumentManager()
                ->getRepository('FooBarBundle:Article')
                ->removeTag($document);
        }
    }
}

并在services.yml或xml文件中注册此类:

foo_bar.listener.tag_removal:
    class: FooBarBundleEventListenerArticleTagRemovalListener
    tags:
      - { name: doctrine_mongodb.odm.event_listener,event: preRemove }

接下来在文章的自定义repository class中添加以下方法:

public function removeTag($tag)
{
    return $this
        ->createQueryBuilder()
        ->update()
        ->field('tags')->pull($tag)
        ->multiple(true)
        ->getQuery()
        ->execute();
}

这将删除所有可用文章中的标记,然后再删除它.如果要将删除操作级联到所有文章文档. (因此,删除该标记时删除具有特定标记的所有文章,请使用以下存储库方法.)

public function purgeByTag($tag)
{
    $result = $this
        ->createQueryBuilder()
        ->remove()
        ->field('tags')->equals($tag)
        ->getQuery()
        ->execute();

    return $result['n'];
}

更新ArticleTagRemovalListener以调用此方法并完成!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读