0

我正在使用旧版本的 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 %}

所以要明确一点:有没有办法避免教义询问实体中是否已经存在一些孩子?

非常感谢你的帮助

4

1 回答 1

0

Doctrine2 永远不会实例化同一数据库行的 2 个实例。

您可能有两次相同的对象。

您可以通过执行以下操作避免在数组中设置Category两次:$children

public function addChildren(\BGCom\MontreuxBundle\Entity\Category $children)
{
    $children->setParent($this);

    if (!$this->children->has($children)) {
        $this->children[] = $children;
    }   
}
于 2012-10-12T19:45:08.720 回答