2010-02-13 75 views
0

對於所有使用Doctrine的人,我有一個與moveAsLastChildOf()相關的問題。我正在使用Doctrine 1.1.6和Symfony 1.2使用moveAsLastChildOf移動節點

我有一個嵌套樹,有很多元素。我想刪除樹的一個元素,所以首先我必須將它的所有子元素(和後代)移到它的父元素中;然後刪除它。我做到以下幾點:

// 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(); 
} 

但它不工作,甚至兒童都將被刪除。而我想刪除的元素仍然在數據庫中,並且是無意義的。該示例的日誌:

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代碼,並且沒有發現任何錯誤。我必須更好地檢查它。我還要問教條團隊,以確定這是我的問題。

回答

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,但我認爲沒有區別。

+0

非常感謝:-) – fesja 2010-02-15 13:12:47