Doctrine - QueryBuilder中子查询的计数

3

我有一个简单的查询:

$this->qb->select('l.value')
        ->addSelect('count(l) AS cnt')
        ->addSelect('hour(l.time) AS date_hour')
        ->from(Logs::class, 'l')
        ->where('l.header = :header')
        ->groupBy('l.value')
        ->addGroupBy('date_hour')
        ->setParameter('header', 'someheader')

这段代码选择了3个列,有一个条件和两个groupBy。

我想要得到这个查询的记录数量。当然,我不想下载所有记录并检查下载数据的大小。

问题: 如何重建此查询并从数据库中获取单一标量值的结果?


这个查询没有返回单一标量结果。我需要重建它,但我不知道如何做。 - Thomas Banderas
你想要计算什么?记录、时间还是某个值? - Odin Thunder
2个回答

1
我认为你应该在这里使用(id列进行计数):
    ->addSelect('count(l) AS cnt')

像这样的,但如果您展示您的实体,我可以提供正确的解决方案:

         $this->qb->select('l')
        ->addSelect('count(l.id) AS cnt')
        ->addSelect('hour(l.time) AS date_hour')
        ->from(Logs::class, 'l')
        ->where('l.header = :header')
        ->groupBy('l.value')
        ->addGroupBy('date_hour')
        ->setParameter('header', 'someheader')

$count = $qb->getQuery()->getSingleScalarResult();

如何从选定的3列中获取一个单一的标量结果? :P - Thomas Banderas
嗯,我看到了。可能自定义查询是唯一的方法。 - MorganFreeFarm

0

由于在DQL查询中,GROUP BY + COUNT + getSingleScalarResult似乎无法同时使用,我猜你最好的选择是之后再进行计数。

$sub
    ->select('l.id')
    ->addSelect('l.value as hidden val')
    ->addSelect('hour(l.time) AS hidden date_hour')
    ->from(Logs::class, 'l')
    ->where('l.header = :header')
    ->groupBy('val')
    ->addGroupBy('date_hour')
    ->setParameter('header', 'someheader')
;

$subIds = array_column($sub->getQuery()->getResult(), 'id');
$count = count($subIds);

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