Использование moveAsLastChildOf для перемещения узлов - PullRequest
0 голосов
/ 14 февраля 2010

Для всех, кто работает с 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();
}

Но это не работает, даже дети удаляются. И элемент, который я хотел удалить, все еще находится в БД с бессмысленным 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*

Я быстро просмотрел код Доктрины и не нашел ничего плохого. Я должен проверить это лучше. Я также собираюсь попросить команду докторов убедиться, что это моя проблема или нет.

1 Ответ

1 голос
/ 14 февраля 2010

Вы можете использовать это как обходной путь (ключ в том, чтобы обновлять каждый узел всякий раз, когда вы меняете дерево, поэтому я просто получаю 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, но я думаю, что нет никакой разницы.

...