2014-12-08 1 views
2

У меня есть категория сущности, и эта категория имеет рекурсивную связь с самим собой, где каждая категория может быть родителем для нескольких других категорий. Отношения выглядят следующим образом:построитель запросов, один для многих, где многие пустые

/** 
* @var parent 
* @ORM\ManyToOne(targetEntity="Category") 
* @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $parent; 

/** 
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent") 

*/ 
private $children; 

Мне нужно сделать запрос построителя запроса, который выбирает все категории, которые являются либо детьми (у родителей) или категории, которые не имеют родителей, а также не имеют детей (другие слова все категории, кроме родителей, у которых есть дети) Я, похоже, не могу это сделать. Пожалуйста помоги.

ответ

0

Вам необходим следующий DQL запрос:

$query = 'SELECT c FROM AcmeBundle:Category c LEFT JOIN c.parent p LEFT JOIN c.children ch WHERE p IS NOT NULL OR (ch IS NULL AND p IS NULL)'; 

Если вам нужна последовательность QueryBuilder для этого запроса вы можете использовать следующий код:

$qb = $em->createQueryBuilder(); 
$query = $qb 
    ->select('c') 
    ->from('AcmeBundle:Category', 'c') 
    ->leftJoin('c.parent', 'p') 
    ->leftJoin('c.children', 'ch') 
    ->where($qb->expr()->orX(
     $qb->expr()->isNotNull('p'), 
     $qb->expr()->andX(
      $qb->expr()->isNull('ch'), 
      $qb->expr()->isNull('p'), 
     ) 
    )) 
    ->getQuery(); 
+0

Я решил ее witing запроса SQL и переписывание моих форм и мои crud контроллеры (весь беспорядок), так что это делается. Но из любопытства я хотел бы посмотреть, как выглядел бы построитель запросов. Если бы я мог сделать построитель запросов, я мог бы передать его непосредственно в форме. –

+0

После того, как вы станете старше и мудрее, я понимаю, что ваш ответ тоже верный :) –

+0

Приятно послушать его :-) –