我有一个实体类别,此类别与自身具有递归关系,其中每个类别可以是其他几个类别的父级。这种关系看起来像这样:
/**
* @var parent
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
*/
private $children;
我需要创建一个查询构建器查询,该查询选择所有子项(拥有父项)或没有父项且没有子项的类别(换句话说除了有子项的父项之外的所有类别)I似乎无法做到这一点。请帮忙。
答案 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();