首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过id与所有父节点(DoctrineExtensions、Gedmo-Tree NestedTreeRepository、Symfony)获取一些子节点

如何通过id与所有父节点(DoctrineExtensions、Gedmo-Tree NestedTreeRepository、Symfony)获取一些子节点
EN

Stack Overflow用户
提问于 2020-02-09 14:46:02
回答 1查看 1K关注 0票数 2

目标:

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

现在,我想通过id获得特定的类别节点及其所有父节点。

当前解决方案(自定义存储库函数):

代码语言:javascript
复制
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行,col 89: Error:预期的文字,got‘节点’)

提前感谢您抽出时间来!

EN

回答 1

Stack Overflow用户

发布于 2021-01-16 10:49:42

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

在实体中添加

  • ,即分类,添加以下方便的方法:

代码语言:javascript
复制
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数组(以及metho调用结果本身)将包含给定节点的所有父节点(对象)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60137801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档