У меня простой запрос:
$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();
Как из выбранных 3 столбцов получить один скалярный результат? :П
Хм .. Понятно .. наверное, единственный способ - это индивидуальный запрос.
Поскольку 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);
Этот запрос не возвращает единичный скалярный результат. Мне нужно восстановить его, но я не знаю, как