移动“;根“;或父节点-条令嵌套集扩展


Moving "root" or parent nodes - Doctrine NestedSet extension

我正在尝试从gedmo嵌套集扩展blog中复制示例,其中有许多父节点。在那里,您可以创建尽可能多的可移动父节点和子节点(这是嵌套集­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;
}

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

附言:我在master分支。

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

如果您确信这些树制动器与并发无关,那么请在github上打开一个问题并给出用例描述。

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

要显示按名称排序的完整树,只需在伪根节点上使用存储库函数reorder。

您可以交换根节点的id来重新排序。