28 нояб. 2018 г., 20:00:16 PHP doctrine2 orm php 2 Комментария
Не мог не заметить, какое количество вопросов по этому поводу, т.к. сам когда-то искал на это ответ. Проблема в том, что хорошего ответа нет.
Если у вас сложный запрос и вам нужно получить по нему COUNT(*)
, то в сети можно найти вариант вида:
$subQuery = $qb->select('main.id') ->from('Order\Entity\Order', 'main') ->where('main.published = :published') ->setParameters([ 'published' => true, ]); $qb->select('COUNT(o)') ->from('Order\Entity\Order', 'o') ->where($qb->expr()->in('o.id', $subQuery->getDQL())) ->setParameters($subQuery->getParameters()); return $qb->getQuery()->getResult();
Но такой запрос очень медленный. Он подойдет для незначительного объема данных.
А что, если нам нужно выполнить большой запрос и много данных? Здесь на помощь приходит AST Walkers. Все, на самом деле, выполняется без каких-либо проблем. Только, никто документацию не желает читать, а сразу в поиск, а в поиске-то и не всегда есть все ответы. ;) Walkers нужен для трансформации DQL в SQL. Вот так просто. =)
На странице о том, как создать кастомный AST Walkers, уже есть пример, как пользоваться им для подсчета количества. Я приведу более расширенный вариант:
$platform = $entityManager->getConnection()->getDatabasePlatform(); $rsm = new \Doctrine\ORM\Query\ResultSetMapping(); $rsm->addScalarResult($platform->getSQLResultCasing('dctrn_count'), 'count'); $query = clone $mainQuery; $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\CountOutputWalker'); $query->setResultSetMapping($rsm); $query->setParameters($mainQuery->getParameters()); return $query->getQuery()->getResult();
После этого наш запрос будет вида SELECT COUNT(*) FROM (наш подзапрос)
.
Вот и все. =) Также, советую посмотреть Doctrine\ORM\Tools\Pagination\Paginator
, оттуда-то и был взять "более расширенный вариант". ;)
Комментарии [2]
Новый комментарий