我正在使用旧版本的DoctrineExtension.Tree而我没有buildTree。所以我想做同样的事情,但我一直遇到一个问题: 每次我使用findHierarchy(见下文)并遍历层次结构中的所有子项时,它都会获得两次。因为Doctrine仍在查询以查找子节点(即使我在查找层次结构中加载它们)这里有一些有用的代码:
我的实体中的两个函数
/**
* 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 %}
所以要明确一点:如果某些孩子已经存在于实体中,是否有办法避免学说查询?
非常感谢你的帮助
答案 0 :(得分:0)
Doctrine2永远不会实例化同一数据库行的2个实例。
你可能有两次相同的对象。
这样做可以避免在Category
数组中设置$children
两次:
public function addChildren(\BGCom\MontreuxBundle\Entity\Category $children)
{
$children->setParent($this);
if (!$this->children->has($children)) {
$this->children[] = $children;
}
}