Есть некий запрос на получение данных (запрос сокращен для удобства):
$qb = $this->entityManager->createQueryBuilder()
->select(['record', 'type'])
->from(Record::class, 'record')
->leftJoin('record.type', 'type');
$criteria = Criteria::create();
$criteria->andWhere(Criteria::expr()->eq('type.alias', 'news'));
$qb->addCriteria($criteria);
$query = $qb->getQuery();
$query->getScalarResult();
Мне нужно проделать пожалуй тоже самое, только получить кол-во записей скалярным числом. Понятно, что вариант с count($query->getScalarResult()) не подходит по оптимизации.
Подскажите, как можно подсчитать кол-во записей, учитывая join?
Вам необходимо переписать Ваш DQL запрос: нужно определить по какому полю будем считать количество записей - предполагаю, что в Вашем случае, Вы хотите подсчитать к-во record с определенным type.
Тогда DQL будет выглядеть приблизительно так:
$qb = $this->entityManager->createQueryBuilder()
->select('COUNT(record.id)')
->from(Record::class, 'record')
->leftJoin('record.type', 'type')
->groupBy('type.alias');
$countRes = $qb->getQuery()->getScalarResult();
Также, если Вам важно именно оптимизировать этот участок, можно использовать NativeQuery
(http://docs.doctrine-project.org/en/latest/reference/native-sql.html) - через него будет эффективнее, но придется пожертвовать тем, что SQL будете писать в терминах хранилища данных, а не ООП-модели приложения. Какой вариант Вам предпочтительнее, выбирайте из особенностей приложения.
Лично я бы вынес метод получения кол-ва записей по тэгу в отдельный метод репозитория (что то вроде RecordsRepository#countByTag(TagInterface $tag) : int
), и инкапсулировал бы эту логику внутри этого метода, чтобы она не растекалась по приложению.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть сайт на котором все страницы сделаны через SP Page Builder, нужно вывести на главной странице модуль с карточками этих страницДля материалов...
Как проверить, что на сервер пришел запрос от конкретной joomla, например, если запрос от joomla1 то выполнить код1, если нет - что-то другое?
В Yii2 ActiveRecord у модели есть статичный метод deleteAllКак сделать удаление с джоином? Например я хочу вот так сделать: