2015-09-17 3 views
2

Я использую дерево вложенных множеств в моем приложении.фильтр doctrine вложенный набор дерева иерархия детей

я могу легко извлечь все дерево с помощью

 $repo->childrenHierarchy(
      null, /* starting from root nodes */ 
      false, /* false: load all children, true: only direct */ 
      $options 
     ) 

То, что я хочу, хотя это фильтровать объекты этого дерева в соответствии с внешним ключом (категории принадлежат пользователям, так каждая категория имеет USERID)

к сожалению, вариант, который принимает обратный вызов для фильтрации на узле не позволяет фильтрации внешнего ключа, значение внешних ключей не входит в массиве узлов:

$options = array(
     'decorate' => true, 
     'rootOpen' => '<ul>', 
     'rootClose' => '</ul>', 
     'childOpen' => function ($node) use($user) { 
      // $node does not contain any foreign key 
      if ($node['userId'] != $user->getId()) { 
       return null; 
      } 
      return "<li id='".$node['id']."'>"; 
     }, 
     'childClose' => '</li>', 
    ); 

Как я могу решить эту проблему?

ответ

2

я, наконец, нашел решение, вы должны создать новый пользовательский метод в хранилище сущности и продлить первоначальный QueryBuilder своими фильтрами, как так:

public function getTree() 
{ 
    $qb = $this->getNodesHierarchyQueryBuilder(); 
    $qb 
     ->andWhere('node.status = :status') 
     ->setParameter('status', 1) 
     ->andWhere('node.deletedAt IS NULL') 
    ; 

    $aComponents = $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); 

    return $this->buildTreeArray($aComponents); 
} 

В конце концов, вы называете метод buildTreeArray, чтобы создать древовидную структуру.