【问题标题】:Moving "root" or parent nodes - Doctrine NestedSet extension移动“根”或父节点 - Doctrine NestedSet 扩展
【发布时间】:2012-01-07 12:41:33
【问题描述】:

我正在尝试从 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;
}

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

附:我在 master 分支上。

【问题讨论】:

  • 您找到解决方案了吗?
  • @loplateral 最后我做了我想要避免的事情。添加“假”树根类别和所有其他根节点作为假的子节点。虽然存在一些缺点,但它可以在表单中显示类别(在我的情况下)或在无序列表中呈现它们时隐藏虚假类别等。
  • 这也是我现在所做的。对我来说没问题,但我确实不断打破树,不确定它是否完全健壮。
  • 这有什么更新吗?你找到解决办法了吗?

标签: php mysql doctrine symfony nested-sets


【解决方案1】:

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

如果您确定这些树形制动与并发无关,请在github 上打开一个带有用例描述的问题。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多