我的页面出现以下严重错误
The "WildkatProxy\DocumentsTagProxy" document with identifier "4e90eede17bc2ec68c000001" could not be found.
我假设这是因为 Documents Tag Proxy 已从另一个操作中删除,因此引用不再有效。我现在想删除对该对象的陈旧引用,但要悄悄地删除。 (因为这也可能发生在许多其他情况下)无论如何我可以在删除对象时对引用已删除对象的所有对象执行“反向级联”吗?
实现这一目标的最佳做法是什么?
谢谢
安迪
最佳答案
我假设您有两个集合,ArticleTag 和 Article,其中文章引用了文章标签。如果您想在删除标签时从文章中删除标签引用,您可以实现一个事件监听器。
创建一个类:
namespace Foo\BarBundle\EventListener;
use Doctrine\ODM\MongoDB\Event\LifecycleEventArgs;
use Foo\BarBundle\Document\Article;
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: Foo\BarBundle\EventListener\ArticleTagRemovalListener
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 以调用此方法并完成!
关于php - 在 Doctrine MongoDB 中删除对象时,如何删除对该对象的任何引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8906403/