学说中子查询的计数 - querybuilder

问题描述 投票:0回答: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。

我想获取此查询的记录数。当然,我不想下载所有记录并检查下载数据的大小。

问题: 如何重建此查询并从数据库获取结果作为 singleScalarValue()?

php symfony doctrine
3个回答
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();

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

0
投票
  1. 将 COUNT() 与 GROUP BY 结合使用不会返回单个标量值,而是返回按 COUNT() 值分组的结果列表。

  2. 如果结果很多,用 PHP 计算 Doctrine 返回的结果数量效率不高。

您需要执行如下查询:

SELECT COUNT(*) FROM ( YourSubQuery ); 

可以使用 Doctrine Paginator 来统计返回结果的数量:

$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query);

$count = count($paginator);
© www.soinside.com 2019 - 2024. All rights reserved.