0

古いバージョンの DoctrineExtension.Tree を使用していますが、buildTree がありません。同じことをしたいのですが、問題が発生し続けます。findHierarchy(以下を参照)を使用して、階層内のすべての子を反復するたびに、すべてが2回取得されます。Doctrine は引き続き子を検索するためのクエリを実行するため (find Hierarchy にそれらをロードしたにもかかわらず)、ここにいくつかの便利なコードがあります:

私のエンティティの2つの機能

/**
 * 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 つのインスタンスをインスタンス化することはありません。

おそらく、同じオブジェクトが 2 回あります。

これを行うことで、配列に a をCategory2 回設定することを避けることができます。$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 に答える