gpt4 book ai didi

mongodb - 如何使用 mongodb 从 doctrine ODM 中的引用文档数组中删除文档

转载 作者:可可西里 更新时间:2023-11-01 09:53:05 26 4
gpt4 key购买 nike

我有一个 php 对象映射到具有结构的 mongodb 文档(称为 Node)

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

class Node{
/**
* @MongoDB\Id
*/
protected $id;

/**
* @MongoDB\String
*/
protected $domain;

/**
* @MongoDB\ReferenceMany(targetDocument="NodeItem",cascade=
* {"persist"},simple="true")
*/
protected $items = array();

//getter and setters below
}

还有一个名为 NodeItem 的引用文档,

class NodeItem {

/**
* @MongoDB\Id
*/
protected $id;

/**
* @MongoDB\String
*/
protected $name;

/**
* @MongoDB\ReferenceOne(targetDocument="Node", cascade={"persist"},
* simple="true")
*/
protected Node;

//setter and getters
}

正如上面的注释所反射(reflect)的那样,“Node”引用了存储在 $items 数组中的许多“NodeItems”,而“NodeItems”引用了一个“Node”。所以这些是双向引用的集合。

我的问题是如何有效地从其集合中删除一些“NodeItem”文档(基于可用 ID 数组),以便删除的 NodeItem 文档也从“Node”(级联)中的 $items 数组引用中删除删除我认为是我要求的?)。

我编写了一个具有如下代码的函数:

   $qb = $this->dm->createQueryBuilder('SomeBundleBundle:NodeItem');
/*
* deletes from NodeItem collection
*/
foreach($NodeItemsArray as $itemId){
$qb->remove()->field('id')->equals($itemId)->getQuery()->execute();
}

但是上面的函数只删除了NodeItem集合中的文档,'Node'的$items数组中的关联项并没有被删除。此外,注释中的 {cascade:persist} 似乎没有帮助。代码在Symfony 2框架中实现

感谢一些帮助!

最佳答案

实现这一目标的唯一方法是在 onRemove 事件上使用监听器。

但是@jmikola 已经提到,您必须使用 $dm->remove() 方法,而不是 QueryBuilder(因为它还不支持事件)。


因此,要删除项目,请执行以下操作:

//Get the NodeItem you want in the items array and delete it:
$items = $node->getItems();
$dm->remove($items->get(2)); //Remove the third item as an example

然后注册事件:

class CascadeNodeDeleterListener {
public function preRemove(LifecycleEventArgs $eventArgs) {

$odm = $eventArgs->getDocumentManager(); /* @var $odm DocumentManager */
$object = $eventArgs->getDocument();
if($object instanceOf NodeItem) {
$node = $object->getNode();
$items = $node->getItems();
$items->removeElement($object);
$class = $dm->getClassMetadata(get_class($node));
$dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $node);
}

}
}

services.yml中:

 <service id="listener" class="CascadeNodeDeleterListener">
<tag name="doctrine.common.event_listener" event="onRemove" />
</service>

参见 Doctrine ODM Events来自更多信息。

关于mongodb - 如何使用 mongodb 从 doctrine ODM 中的引用文档数组中删除文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10623577/

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