Я использую QueryBuilder Doctrine для создания запроса, и я хочу получить общее количество результатов из запроса.
$repository = $em->getRepository('FooBundle:Foo');
$qb = $repository->createQueryBuilder('n')
->where('n.bar = :bar')
->setParameter('bar', $bar);
$query = $qb->getQuery();
//this doesn't work
$totalrows = $query->getResult()->count();
Я просто хочу выполнить подсчет этого запроса, чтобы получить общее количество строк, но не вернуть фактические результаты. (После этого запроса количества я собираюсь изменить запрос с помощью maxResults для разбивки на страницы.)
symfony
doctrine-orm
Acyra
источник
источник
Ответы:
Что-то вроде:
Некоторые люди считают, что выражения как-то лучше, чем просто использование DQL. Один даже зашел так далеко, что отредактировал четырехлетний ответ. Я откатил его правку обратно. Пойди разберись.
источник
bar = $bar
);)count()
on$query->getResult()
фактически заставляет запрос возвращать результаты (чего он не хотел). Я думаю, что это должен быть принят ответ$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
вместоselect('count(account)')
?Вот еще один способ отформатировать запрос:
источник
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
Лучше перенести всю логику работы с базой данных на репозитории.
Так в контроллере пишешь
И в
Repository/FooRepository.php
Лучше перейти
$qb = ...
к отдельной строке, если вы хотите сделать сложные выражения, такие какТакже подумайте о кэшировании результатов запроса - http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
В некоторых простых случаях
EXTRA_LAZY
полезно использовать отношения сущностейhttp://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
источник
Если вам нужно посчитать более сложный запрос с помощью
groupBy
, иhaving
т.д ... Вы можете позаимствовать уDoctrine\ORM\Tools\Pagination\Paginator
:источник
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
которому на самом деле ничего особенного, но хорошо известное решение COUNT (*)Так
Doctrine 2.6
как можно использоватьcount()
метод непосредственно изEntityRepository
. Подробности смотрите по ссылке.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
источник
Пример работы с группировкой, объединением и прочим.
Проблема:
Для того, чтобы это работало, возможное решение состоит в том, чтобы использовать собственный гидратор и эту странную вещь, называемую «ПОЛЬЗОВАТЕЛЬСКИЙ ВЫХОДНОЙ СОВЕТ»:
источник
Для людей, которые используют только Doctrine DBAL, а не Doctrine ORM, они не смогут получить доступ к
getQuery()
методу, потому что он не существует. Им нужно сделать что-то вроде следующего.источник
Для подсчета элементов после некоторого количества элементов (смещение) в этом случае нельзя применить $ qb-> setFirstResults (), так как он работает не как условие запроса, а как смещение результата запроса для диапазона выбранных элементов ( то есть setFirstResult вообще не может использоваться вместе с COUNT). Поэтому для подсчета оставшихся предметов я просто сделал следующее:
Кто-нибудь знает более чистый способ сделать это?
источник
Добавление следующего метода в ваш репозиторий должно позволить вам звонить
$repo->getCourseCount()
с вашего контроллера.источник
Вы также можете получить количество данных с помощью функции подсчета.
источник