目标:
我有一个类别实体。 每个类别都可以有子类别。
现在我想通过 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行:错误:预期字面量,为“节点”)
提前感谢您抽出宝贵的时间!
答案 0 :(得分: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
数组(以及方法调用结果本身)将包含给定节点的所有父节点(对象)