我为Doctrine2创建了一个简单的库来管理树结构。在存储库类中,我创建了预加载树节点子节点的方法。我的方法首先下载指定节点的所有子节点,直到某个深度为平面数组,然后重新创建树结构。它工作正常,但我想将预加载的子节点设置为默认未初始化PersistentCollection
的节点。当我用PersistentCollection
用满载节点替换ArrayCollection
时,Doctrine“认为”我改变了关系,并在持久化后再尝试设置它们。
有没有办法再次将我的节点标记为干净以防止Doctrine再次保存关系?
Currenty我的代码看起来像这样:
public function prepopulateTree($parent, $depth = 0)
{
$em = $this->_em;
$metadata = $this->getClassMetadata();
// Retrive flat array of child nodes using closure table.
$childs = $this->getChildHierarchyQueryBuilder($parent, false, $depth)->getQuery()->getResult();
$recursive = function($node, $parent, $currentDepth) use (&$em, &$metadata, &$childs, &$depth, &$recursive) {
$collection = new ArrayCollection();
foreach ($childs as $n => $child) {
if ($child->getParentNode()->getId() === $node->getId()) {
$collection->add($child);
unset($childs[$n]);
}
}
$node->setParentNode($parent);
$node->setChildNodes($collection);
if ($depth > 0 && $currentDepth >= $depth) {
return;
}
foreach ($collection as $child) {
$recursive($child, $node, $currentDepth + 1);
}
};
$recursive($parent, null, 1);
return $parent;
}
parentNode和childNodes在Doctrine文档中的示例中声明:http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-many-self-referencing