количество подзапросов в доктрине - построитель запросов - PullRequest
0 голосов
/ 16 ноября 2018

У меня простой запрос:

$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.

Я хочу получить количество записей этого запроса.Конечно, я не хочу загружать все записи и проверять размер загружаемых данных.

Вопрос: Как перестроить этот запрос и получить результат из db как singleScalarValue ()?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Поскольку 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 голосов
/ 16 ноября 2018

Я думаю, вы должны использовать (столбец 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();
...