我正在使用旧版本的 DoctrineExtension.Tree 并且我没有 buildTree。所以我想做同样的事情,但我一直遇到一个问题:每次我使用 findHierarchy(见下文)并迭代层次结构中的所有孩子时,它都会两次获得所有内容。因为 Doctrine 仍然查询以查找子项(即使我将它们加载到 find Hierarchy 中)这是一些有用的代码:
我的实体中的两个功能
/**
* Add children
*
* @param BGCom\MontreuxBundle\Entity\Category $children
*/
public function addChildren(\BGCom\MontreuxBundle\Entity\Category $children)
{
$children->setParent($this);
$this->children[] = $children;
}
/**
* Get children
*
* @return Doctrine\Common\Collections\Collection
*/
public function getChildren()
{
return $this->children;
}
在我的仓库中找到层次结构:
public function findHierarchy() {
$qb = $this
->createQueryBuilder('node')
->where('node.lvl < 2')
->andWhere('node.in_menu = 1')
->orderBy('node.root, node.lvl', 'ASC');
// set hint to translate nodes
$query = $qb->getQuery()->setHint(
Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
);
$res = $query->getResult();
//Now build the right entity
// build tree in english
$i = 0;
$j = 0;
// We rebuild the tree
$parent = array();
while($i < count($res)) {
$cur = $res[$i];
$parent[] = $cur;
$i++;
while ($i < count($res) && $res[$i]->getRoot() === $cur->getId()) {
$cur->addChildren($res[$i]);
$i++;
}
}
return $parent;
}
我的观点:
{% for root in trees %}
<li>
<a href="{{ category_path(root) }}">{{ root.name }}</a>
<div class="box blue-gradient">
<ul class="lvl1">
{% for twig in root.getChildren() %}
<li><a href="{{ category_path(twig)}}">
{{ twig.name }}
</a></li>
{% endfor %}
</ul>
</div>
</li>
{% endfor %}
所以要明确一点:有没有办法避免教义询问实体中是否已经存在一些孩子?
非常感谢你的帮助