学说避免自动补水

时间:2012-10-12 14:00:09

标签: php symfony doctrine

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

所以要明确一点:如果某些孩子已经存在于实体中,是否有办法避免学说查询?

非常感谢你的帮助

1 个答案:

答案 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;
    }   
}