1

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

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

ответ

1

Найдено решение.

  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 = []; 
    
        ... 
    
0

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

$tree = $repo->childrenHierarchy(); 

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

  • Нет связанных вопросов^_^