Есть некий запрос на получение данных (запрос сокращен для удобства):
$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), и инкапсулировал бы эту логику внутри этого метода, чтобы она не растекалась по приложению.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости