对于所有使用Doctrine的人,我都有一个与moveAsLastChildOf()相关的问题。我正在使用Doctrine 1.1.6和Symfony 1.2
我有一个嵌套的树,有很多元素。我想删除树的一个元素,所以首先我必须将它的所有子元素(和后代)移动到它的父元素;然后删除它。我做了以下事情:
// Get the parent
$parent = $object->getParent();
if ($object->getNode()->isValidNode())
{
$children = $object->getNode()->getChildren();
// Move each child to the parent of this object (grandparent of the children)
foreach($children as $child){
$child->getNode()->moveAsLastChildOf($parent);
}
// and then delete the element
$object->getNode()->delete();
}
else
{
$object->delete();
}
但它不起作用,即使是儿童也被删除了。我想删除的元素仍然在DB上,带有无意义的lft& rgt。该示例的日志:
parent id=2412 lft(2044) rgt(2523) level(5)
to lft(2044) rgt(2523) level(5)
object to delete id=2487 lft(2375) rgt(2384) level(6)
to lft(2375) rgt(2509) level(6) *non deleted and with non-sense lft & rgt*
id=2491 lft(2376) rgt(2377) level(7)
to lft(2521) rgt(2522) level(6)
id=2490 lft(2378) rgt(2379) level(7)
to lft(2376) rgt(2377) level(6) *deleted*
id=2489 lft(2380) rgt(2381) level(7)
to lft(2519) rgt(2520) level(6)
id=2488 lft(2382) rgt(2383) level(7)
to lft(2378) rgt(2379) level(6) *deleted*
我已经快速查看了Doctrine代码,但我没有发现任何错误。我要更好地检查一下。我还要问教条团队,以确定这是我的问题。
答案 0 :(得分:1)
你可以使用它作为解决方法(关键是每当你更改树时刷新每个节点,所以我只轮流得到1个孩子,最后刷新原始节点):
$node = $tag->getNode();
if ($node->hasParent()) {
$parent = $node->getParent();
while ($child = $node->getFirstChild()) {
$child->getNode()->moveAsLastChildOf($parent);
}
} else {
while ($child = $node->getFirstChild()) {
$child->getNode()->makeRoot($child->id);
}
}
$tag->refresh()->getNode()->delete();
我正在使用Doctrine 1.2,但我认为没有区别。