移动“root”或父节点 - Doctrine NestedSet扩展

时间:2012-01-07 12:41:33

标签: php mysql doctrine symfony nested-sets

我正在尝试从gedmo nested-set扩展名 blog 复制示例,其中有许多父节点。在那里,您可以创建尽可能多的可移动父节点以及子节点(这是nested set­Wikipedia的典型节点)。

阅读评论部分,常见的建议是删除@Gedmo\TreeRoot annotation/mapping,但是如果我这样做,我就能够移动根节点,但树会被打破特别是左右id。如果我保留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;
}

问题:如何创建多个根树(我想避免创建将是单根的假类别,并将其他所有内容添加为该节点的子节点),并且能够移动root节点上下?

P.S。我在主分公司。<​​/ p>

3 个答案:

答案 0 :(得分:1)

树将在并发更新时中断,请参阅tree locking文档。当树更新时,它会运行两个原子更新查询,而这些查询又可以从具有不同状态的并发请求运行,而这些状态不知道正在完成的任务。 当覆盖它时,树应该保持其稳定性,我已经成功地将此扩展用于100K-1M节点树,这是基于根目录。

如果您确定这些树制动器与并发性无关,请使用用例说明在github上打开一个问题。

答案 1 :(得分:0)

在我看来,创建假根类别的解决方案是最好的。那么你的真正根源将是这个假根的孩子。

要显示按名称排序的完整树,只需在假根节点上使用存储库功能重新排序。

答案 2 :(得分:-3)

您可以交换根节点的ID以重新排序它们。