Doctrine 2嵌套集 - 在单个查询中检索完整树

时间:2016-07-02 22:51:16

标签: doctrine-orm nested-sets doctrine-extensions stofdoctrineextensions

我正在使用stof/StofDoctrineExtensionsBundleAtlantic18/DoctrineExtensions的Bundle包装器)来实现嵌套集(树)实体。该实体已配置并正常工作,但我无法弄清楚如何在单个查询中检索所有子注释(完整树)的所有根注释。我目前有完整的集合返回,但它延迟加载所有孩子,这意味着执行了大量的查询。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

找到解决方案。

  1. 检索节点对象的完整列表:

    $repo = $this->getDoctrine()->getManager()->getRepository('NestedEntity');
    $nodes = $repo->getChildren();
    
  2. 使用您的节点构建树。

    $tree = $repo->getRepoUtils()->buildTreeArray($nodes);
    
  3. buildTreeArray方法接受节点数组的数组,因此您必须在实体中实现ArrayAccess接口。它还将所有子节点放在node-array的__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 = [];
    
         ...
    

答案 1 :(得分:1)

您可以使用childrenHierarchy()方法进行整个树检索:

$tree = $repo->childrenHierarchy();