gpt4 book ai didi

php - 当在 Doctrine MongoDB 中删除该对象时,我该如何删除对该对象的任何引用?

转载 作者:可可西里 更新时间:2023-11-01 09:15:54 25 4
gpt4 key购买 nike

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

The "WildkatProxy\DocumentsTagProxy" document with identifier "4e90eede17bc2ec68c000001" could not be found.

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

实现此目标的最佳做法是什么?

谢谢安迪

最佳答案

我假设您有两个集合,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com