0

У меня есть переменная $ path, которая содержит массив имен категорий родства. Используя эту переменную, я хотел бы создать новый массив $ categories_children, который будет содержать массив дочерних элементов каждой категории из массива $ path в соответствии с его названием. Я использую Doctrine Tree-Nestedset расширение Гедиминаса Morkevicius и я попытался это:Итерация пути дерева Doctrine в Symfony 2

$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); 
    } 

Проблема заключается в том, что метод GetChildren() с аргументом $ родителя возвращает тот же массив, как например, когда передаются аргумент NULL. Это означает, что он вернет все узлы, начиная с root, вместо того, чтобы начинать с выбранной категории. Как-то метод findOneByTitle(), который используется в переменной $ parent, не принимает аргументы из getPath() и ведет себя как NULL.

ответ

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()) 
    ; 

    ... 
} 

Если вам нужен только прямой Чайлдс simplets способ указать Чайлдс поля в сущности

/** 
* @ORM\OneToMany(targetEntity="AbstractTreeNode", mappedBy="parent", fetch="EXTRA_LAZY") 
* @ORM\OrderBy({"lft" = "ASC"}) 
*/ 
protected $childs; 
+0

Теперь, когда я использую getTreeAsFlatArray ($ родительский), он возвращает «FatalErrorException: ошибка: Вызов функции члена getLft() на не-объект ". –

+0

его просто пример запроса, как вы можете получить дочерние узлы, узел готов к использованию функции. –

+0

Хорошо, я настрою getTreeAsFlatArray() только для моего использования. Я также пытался использовать дочернее поле с методом get в сущности. Для получения дочерних элементов я просто использовал $ categories_children [] = $ repo-> getChilds(). Но результаты поиска все те же: «Ошибка: вызов функции-члена getChilds() для не-объекта». Я не понимаю, как метод findOneByTitle() возвращает нечто иное, чем объект. Благодарю. –

Смежные вопросы