Symfony Doctrine 分组查询

6

我有以下 SQL 查询可以正常运行:

SELECT completed_by, count(*) AS Total
FROM tasks
WHERE completed_by is not null AND status = 1
GROUP BY completed_by
;

我正在使用Doctrine查询构建器进行操作,但是出现了错误,无法正常工作。

$parameters = array(
                    'status' => 1,
                );

$qb = $repository->createQueryBuilder('log');
$query = $qb
->select(' log.completedBy, COUNT(log) AS Total')
->where('log.Status = :status')
->groupBy('log.completedBy')
->setParameters($parameters)
->getQuery();

我遇到以下错误:

[语义错误] 第0行,第21列处的 'completedBy,' 错误:无效的路径表达式。必须是状态字段路径表达式。

3个回答

6
我知道这个答案可能有点晚,但我也曾经遇到过完全相同的问题,在互联网上找不到任何答案,我相信很多人也会遇到同样的问题。
我假设你的"completedBy"是指另一个实体。
因此,在你的存储库中,你可以写入以下内容:
$query = $this->createQueryBuilder("log")
              ->select("completer.id, count(completer)")
              ->join("log.completedBy", "completer")
              ->where('log.Status = :status')
              ->groupBy("completer")
              ->setParameters($parameters)
              ->getQuery();

这将编译成类似以下的内容:
SELECT completer.id, count(completer) FROM "YOUR LOG CLASS" log INNER JOIN log.completedBy completer WHERE log.Status=:status GROUP BY completer

现在,您可以通过他们的ID执行另一个查询来获取那些“完成者”。

2

当您想选择作为另一个表(实体)的外键的列时,请使用IDENTITY函数而不是仅使用列名。 例如:在您的情况下

$parameters = array(
                    'status' => 1,
                );

$qb = $repository->createQueryBuilder('log');
$query = $qb
    ->select('IDENTITY(log.completedBy), COUNT(log.something) AS Total')
    ->where('log.Status = :status')
    ->groupBy('log.completedBy')
    ->setParameters($parameters)
    ->getQuery();

你的回答可以通过添加更多的支持信息来改进。请编辑以添加更多细节,例如引用或文档,以便其他人可以确认你的答案是正确的。你可以在帮助中心找到更多关于如何撰写好答案的信息。 - Community

0
这是错误的:COUNT(log) AS Total。应该改为类似于COUNT(log.log) AS Total

你的“log”表中是否有“log”列?如果没有,那么你可能应该使用count(log.id)或类似的方法。 - michaJlS
是的,这是ID列,我已经替换了它,但在 ->groupBy('log.completedBy') 处仍然出现相同的错误。 - Muhammad Taqi
但这不是 groupBy() 的错误,而是 select() 的错误。看一下消息:completedBy, - 这里有一个逗号,它出现在选择子句中,而不是分组子句中。 - michaJlS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接