0

兄弟カテゴリの名前の配列を含む変数 $path があります。この変数を使用して、新しい配列 $categories_children を作成します。これには、タイトルに従って $path 配列から各カテゴリの子の配列が含まれます。私はGediminas Morkevicius によるDoctrine Tree-Nestedset拡張機能を使用しており、これを試しました:

    $em = $this->getDoctrine()->getManager();
    $repo = $em->getRepository('MyProjectAdminBundle:Category');

    $category = $repo->findOneById($id);       
    $path = $repo->getPath($category);

    $categories_children = array();

    foreach($path as $node){
        $parent = $repo->findOneByTitle($node);
        $categories_children[] = $repo->getChildren($parent, true);
    }

問題は、引数 $parent を持つメソッド getChildren() が、渡された引数が NULL の場合と同じ配列を返すことです。つまり、選択したカテゴリからではなく、ルートから始まるすべてのノードが返されます。$parent 変数で使用されているメソッド findOneByTitle() は、なぜか getPath() からの引数を受け入れず、NULL として動作します。

4

1 に答える 1

0

getChildren$parent 引数は、ツリーを取得するルート要素のみを指定します。childrenQueryBuilderで関数のコードを見ることができますNestedTreeRepository

すべての子を取得するには、リポジトリで独自の関数を使用します。

public function getTreeAsFlatArray( AbstractTreeNode $parent = null, array $options = array() ) {
    $qb = $this->createQueryBuilder('node');    
    $qb
        ->andWhere('node.lft > :parent_lft')
            ->setParameter('parent_lft', $parent->getLft() )
        ->andWhere('node.lft < :parent_rgt')
            ->setParameter('parent_rgt', $parent->getRgt() )
        ->andWhere('node.level <= :level')
            ->setParameter('level', $parent->getLevel() + $o['depth'])
        ->andWhere('node.root = :root')
            ->setParameter('root', $parent->getRoot())
    ;

    ...
}   

エンティティで子フィールドを指定する直接の子シンプレットの方法のみが必要な場合

/**
 * @ORM\OneToMany(targetEntity="AbstractTreeNode", mappedBy="parent", fetch="EXTRA_LAZY")
 * @ORM\OrderBy({"lft" = "ASC"})
 */
protected $childs;
于 2013-07-04T09:30:51.193 に答える