2014-12-08 43 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查询和重写我的形式和我的废话控制器(整个一塌糊涂)就这样完成了。但出于好奇,我想看看查询生成器的样子。如果我能做查询生成器,我可以直接在表单中传递它。 – 2014-12-08 14:17:11

+0

变得懂事了我意识到,你的答案是正确的,以及:) – 2015-06-01 14:48:49

+0

很高兴听到它:-) – 2015-06-02 08:34:02