首页 > 解决方案 > 使用查询生成器在分组查询中获取 COUNT(),在 SELECT 中使用分组列

问题描述

我正在尝试执行以下操作:

$qb->select('O.place')
    ->addSelect('COUNT(P.id)')
    ->from(FooBar::class, 'O')
    ->innerJoin('O.bar', 'P')
    ->andWhere('O.place IN (:places)')
    ->andWhere('P.accountEnabled = true')
    ->groupBy('O.place.id')
    ->setParameter('places', $locationIds)
    ->getQuery()->getArrayResult();

所需的最终 SQL 查询将是这样的(有效):

SELECT O.place_id, COUNT(DISTINCT P.Id) partnerCount
FROM foo_bar O
         INNER JOIN bar P ON O.bar_id = P.id
WHERE 
      O.place_id IN (83,134)
  AND P.account_enabled = TRUE
GROUP BY O.place_id;

和 之间存在多对一关系,FooBar并且Bar和之间存在另一种多对一关系FooBarPlace但是由于对于此查询,我对该表中的任何详细信息都不感兴趣,因此我不需要加入它.

当我尝试上述方法时,我得到:

[语义错误] 第 0 行,第 9 列靠近 'place,COUNT(DISTINCT':错误:无效的 PathExpression。必须是 StateFieldPathExpression。"

如果我这样做:

$qb
    ->select('COUNT (DISTINCT O.partnerUser)')
    ->from(Foo::class, 'O')
    ->innerJoin('O.bar', 'P')
    ->andWhere('O.place IN (:places)')
    ->andWhere('P.accountEnabled = true')
    ->groupBy('O.place')
    ->setParameter('places', $locationIds)
->getQuery()->getArrayResult();

查询有效,但结果不包括place.id,我需要知道这些聚合总计属于什么。结果查询是:

SELECT COUNT(DISTINCT p0_.partner_user_id) AS sclr_0
FROM foos p0_
INNER JOIN bars p1_ ON p0_.partner_user_id = p1_.id
WHERE p0_.place_id IN (?)
AND p1_.account_enabled = true
AND p1_.bid_balance > 0
GROUP BY p0_.place_id

此查询类似于我想要的查询,但同样,它foos.place_id在结果中缺少(我分组依据的字段)。

如何使用 query-builder执行此查询?

标签: phpdoctrine-ormdoctrinequery-builder

解决方案


推荐阅读