查询构建器,一对多,其中很多是空的

时间:2014-12-08 09:11:06

标签: php symfony doctrine query-builder

我有一个实体类别,此类别与自身具有递归关系,其中每个类别可以是其他几个类别的父级。这种关系看起来像这样:

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

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

 */
private $children;

我需要创建一个查询构建器查询,该查询选择所有子项(拥有父项)或没有父项且没有子项的类别(换句话说除了有子项的父项之外的所有类别)I似乎无法做到这一点。请帮忙。

1 个答案:

答案 0 :(得分:1)

您需要下一个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();