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以调用此方法并完成! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |