我有一个简单的查询:
$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。
我想获取此查询的记录数。当然,我不想下载所有记录并检查下载数据的大小。
问题: 如何重建此查询并从数据库获取结果作为 singleScalarValue()?
我认为你应该在这里使用(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();
由于 GROUP BY + COUNT + getSingleScalarResult 似乎在 DQL 查询中不能一起工作,我想你最好的选择是事后计数
$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);
将 COUNT() 与 GROUP BY 结合使用不会返回单个标量值,而是返回按 COUNT() 值分组的结果列表。
如果结果很多,用 PHP 计算 Doctrine 返回的结果数量效率不高。
您需要执行如下查询:
SELECT COUNT(*) FROM ( YourSubQuery );
可以使用 Doctrine Paginator 来统计返回结果的数量:
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query);
$count = count($paginator);