子查询中的计数-querybuilder

时间:2018-11-16 11:20:10

标签: php symfony doctrine

我有一个简单的查询:

$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()的形式从db获取结果?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

由于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);