Перемещение «корневых» или родительских узлов - расширение Doctrine NestedSet - PullRequest
5 голосов
/ 07 января 2012

Я пытаюсь скопировать пример из gedmo nested-set extension blog , где есть много родительских узлов. Там вы можете создать столько же подвижных родительских узлов, сколько дочерних (что типично для вложенного набора & shy; Wikipedia ).

Чтение раздела комментариев через общие советы - удаление @Gedmo\TreeRoot annotation/mapping, но если я это сделаю, я смогу переместить корневые узлы, но дерево сломается, особенно левый и правый идентификаторы. Если я сохраню TreeRoot и попытаюсь переместить корневые узлы, я получу «братьев и сестер без узлов» или что-то в этом роде, как и ожидалось.

Глядя на живой пример в блоге расширений, вы можете видеть, что вы можете создать категорию без родителя и перемещать ее вверх или вниз.

Сущность моей категории - соответствующие части:

class Category 
{
    /**
     * @Gedmo\TreeLeft
     * @ORM\Column(name="lft", type="integer")
     */
    private $lft;

    /**
     * @Gedmo\TreeLevel
     * @ORM\Column(name="lvl", type="integer")
     */
    private $lvl;

    /**
     * @Gedmo\TreeRight
     * @ORM\Column(name="rgt", type="integer")
     */
    private $rgt;

    /**
     * @Gedmo\TreeRoot
     * @ORM\Column(name="root", type="integer", nullable=true)
     */
    private $root;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     * @ORM\OrderBy({"lft" = "ASC"})
     * @Exclude
     */
    private $children;
}

Вопрос: Как создать множественное корневое дерево (я хотел бы избежать создания фиктивной категории, которая будет единичным корнем, и добавлять все остальное как дочерний элемент этого узла) и иметь возможность перемещать корневые узлы вверх и вниз?

P.S. Я на главной ветке.

Ответы [ 3 ]

1 голос
/ 27 февраля 2014

Дерево будет разрываться при одновременных обновлениях, см. блокировка дерева документация. Когда дерево обновляется, оно запускает два атомарных запроса на обновление, которые, в свою очередь, могут быть выполнены из параллельного запроса с другим состоянием, не осведомленным о выполняемых запросах. Когда это покрыто, дерево должно сохранять свою стабильность, я успешно использовал это расширение для дерева узлов 100K - 1M, которое основывалось на корнях.

Если вы уверены, что эти древовидные тормоза не связаны с параллелизмом, откройте проблему на github с описанием варианта использования.

0 голосов
/ 28 февраля 2014

Ваше решение по созданию фальшивой корневой категории является лучшим, на мой взгляд.Тогда ваши настоящие корни будут детьми этого поддельного корня.

Чтобы отобразить полное дерево, отсортированное по имени, просто используйте переупорядочение функций репозитория на поддельном корневом узле.

0 голосов
/ 08 февраля 2012

Вы можете поменять местами идентификаторы корневых узлов, чтобы изменить их порядок.

...