2

目标:

我有一个类别实体。每个类别都可以有子类别。

现在我想通过 id 和它的所有父母来获取特定的类别节点

我当前的解决方案(自定义存储库功能):

public function getChildrenHierarchyByCategoryIDs($categoryIDsArray)
{
    $qb = $this->getNodesHierarchyQueryBuilder();
    $qb->andWhere('node.id in (:categoryIDs)')
       ->setParameter('categoryIDs', $categoryIDsArray)
        ->orWhere('node.id in (:rootNodes)') // "Workaround", get all available root nodes (1st level only) manually, because I don't know how to get them by children's parentID (node.parent) "automatically" (with second level etc.)
        ->setParameter('rootNodes', $this->getRootNodes())
    ;

    $aComponents = $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);

    return $this->buildTreeArray($aComponents);
}

问题:

如何自动获取父节点(由 id 找到的所有节点),而不是通过 id 手动获取每个可能的父节点(参见代码中的“解决方法”)?

我找不到任何解决方案..

我认为它应该是这样的:->orWhere('node.id in (node.parent)')这是行不通的。([语法错误] 第 0 行,第 89 列:错误:预期文字,得到“节点”)

提前感谢您抽出宝贵时间!

4

1 回答 1

0

如果您需要获取给定节点的所有父节点(在层次结构中),这相当简单:

  • 在您的实体(即类别)中,添加以下便捷方法:
public function getParentNodes(?Category $node = null, $parents = []): array
{
    if (!$node) {
        $node = $this;
    }
    if (null !== $this->getParent()) {
        $parent = $this->getParent();
        $parents[] = $parent;
        return $parent->getParentNodes($node, $parents);    
    }
    return $parents;
}

在此之后,$parents数组(以及方法调用结果本身)将包含给定节点的所有父节点(对象)

于 2021-01-16T10:49:42.733 回答