我在我的应用程序中使用了一个doctrine嵌套集树。
我可以使用
轻松检索整棵树 $repo->childrenHierarchy(
null, /* starting from root nodes */
false, /* false: load all children, true: only direct */
$options
)
我想要的是根据外键过滤此树的实体(类别属于用户,因此每个类别都有userId)
不幸的是,接受回调以在节点上进行过滤的选项不允许对外键进行过滤,外键值不包含在节点数组中:
$options = array(
'decorate' => true,
'rootOpen' => '<ul>',
'rootClose' => '</ul>',
'childOpen' => function ($node) use($user) {
// $node does not contain any foreign key
if ($node['userId'] != $user->getId()) {
return null;
}
return "<li id='".$node['id']."'>";
},
'childClose' => '</li>',
);
我该如何解决这个问题?
答案 0 :(得分:2)
我终于找到了解决方案,您必须在实体的存储库中创建一个新的自定义方法,并使用您自己的过滤器扩展原始的queryBuilder,如下所示:
public function getTree()
{
$qb = $this->getNodesHierarchyQueryBuilder();
$qb
->andWhere('node.status = :status')
->setParameter('status', 1)
->andWhere('node.deletedAt IS NULL')
;
$aComponents = $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
return $this->buildTreeArray($aComponents);
}
最后,调用方法buildTreeArray以创建树结构。