Doctrine, как посчитать кол-во записей с join?

221
05 декабря 2017, 22:15

Есть некий запрос на получение данных (запрос сокращен для удобства):

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

Answer 1

Вам необходимо переписать Ваш 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), и инкапсулировал бы эту логику внутри этого метода, чтобы она не растекалась по приложению.

READ ALSO
Зачем в PHP нужны фигурные скобки?

Зачем в PHP нужны фигурные скобки?

Какой смысл в данных фигурных скобках?

201
Интеграция компонентов Shortcode и SP Page Builder (Joomla)

Интеграция компонентов Shortcode и SP Page Builder (Joomla)

Есть сайт на котором все страницы сделаны через SP Page Builder, нужно вывести на главной странице модуль с карточками этих страницДля материалов...

274
Как проверить соответсвие запроса от joomla

Как проверить соответсвие запроса от joomla

Как проверить, что на сервер пришел запрос от конкретной joomla, например, если запрос от joomla1 то выполнить код1, если нет - что-то другое?

255
DeleteAll with join?

DeleteAll with join?

В Yii2 ActiveRecord у модели есть статичный метод deleteAllКак сделать удаление с джоином? Например я хочу вот так сделать:

291