我的页面出现以下严重错误

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/

10-16 14:26
查看更多