如何通过所有父母的ID获得一些子节点(DoctrineExtensions,Gedmo-Tree NestedTreeRepository,Symfony)

时间:2020-02-09 14:46:02

标签: symfony doctrine-orm doctrine doctrine-extensions gedmo-tree

目标:

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

现在我想通过 all 其父代通过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行:错误:预期字面量,为“节点”)

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

1 个答案:

答案 0 :(得分:0)

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

  • 在您的实体,即 Category 中,添加以下方便的方法:
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 数组(以及方法调用结果本身)将包含给定节点的所有父节点(对象)

相关问题