Вложенный набор Doctrine 2 - получить полное дерево в одном запросе

Я использую stof/StofDoctrineExtensionsBundle (оболочка пакета для Atlantic18/DoctrineExtensions) для реализации сущности вложенного набора (дерева). Объект настроен и работает, но я не могу понять, как получить все корневые заметки со всеми их дочерними элементами (полными деревьями) в одном запросе. В настоящее время у меня есть полная коллекция, но она лениво загружает все дочерние элементы, что означает выполнение большого количества запросов.

Спасибо за любую помощь.


person James Crinkley    schedule 02.07.2016    source источник


Ответы (2)


Нашел решение.

  1. получить полный список объектов узла:

    $repo = $this->getDoctrine()->getManager()->getRepository('NestedEntity');
    $nodes = $repo->getChildren();
    
  2. построить дерево с вашими узлами.

    $tree = $repo->getRepoUtils()->buildTreeArray($nodes);
    
  3. Метод buildTreeArray принимает массив массивов узлов, поэтому вы должны реализовать интерфейс ArrayAccess в своей сущности. Также он помещает всех дочерних элементов в ключ __children массива узлов.

    /**
     * @Gedmo\Tree(type="nested")
     * @ORM\Table(name="nested_entity")
     * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
     */
     class NestedEntity implements \ArrayAccess
     {
    
         public function offsetExists($offset)
         {
             return property_exists($this, $offset);
         }
    
         public function &offsetGet($offset)
         {
             return $this->$offset;
         }
    
         public function offsetSet($offset, $value)
         {
             $this->$offset = $value;
         }
    
         public function offsetUnset($offset)
         {
             $this->$offset = null;
         }
    
         protected $__children = [];
    
         ...
    
person user2554865    schedule 03.08.2016

Вы можете просто использовать метод childrenHierarchy() для извлечения всего дерева:

$tree = $repo->childrenHierarchy();  
person vp_arth    schedule 02.10.2017