Estou usando o QueryBuilder do Doctrine para criar uma consulta e quero obter a contagem total de resultados da consulta.
$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();
Eu só quero executar uma contagem nesta consulta para obter o total de linhas, mas não retornar os resultados reais. (Após essa consulta de contagem, vou modificar ainda mais a consulta com maxResults para paginação.)
symfony
doctrine-orm
Acyra
fonte
fonte
Respostas:
Algo como:
Algumas pessoas acham que as expressões são de alguma forma melhores do que apenas usar DQL direto. Um deles chegou ao ponto de editar uma resposta de quatro anos. Revirei sua edição de volta. Vai saber.
fonte
bar = $bar
);)count()
on$query->getResult()
está realmente fazendo a consulta retornar os resultados (que é o que ele não queria). Eu acho que isso deve ser aceito resposta$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
vez deselect('count(account)')
?Aqui está outra maneira de formatar a consulta:
fonte
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
É melhor mover toda a lógica de trabalhar com o banco de dados para repositórios.
Então no controlador você escreve
E em
Repository/FooRepository.php
É melhor mudar
$qb = ...
para uma linha separada, caso você queira criar expressões complexas comoPense também no cache do resultado da sua consulta - http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
Em alguns casos simples,
EXTRA_LAZY
é bom usar relações de entidadehttp://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
fonte
Se você precisar contar uma consulta mais complexa, com
groupBy
,having
etc ... Você pode pedir emprestado deDoctrine\ORM\Tools\Pagination\Paginator
:fonte
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
o que é realmente nada especial, mas solução COUNT bem conhecido (*)Como
Doctrine 2.6
é possível usar ocount()
método diretamente deEntityRepository
. Para detalhes, consulte o link.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
fonte
Exemplo de trabalho com agrupamento, união e outras coisas.
Problema:
Para que isso funcione, a solução possível é usar o hidratador personalizado e essa coisa estranha chamada 'DICAS DE PERSONALIZAÇÃO DA SAÍDA PERSONALIZADA':
fonte
Para pessoas que estão usando apenas o Doctrine DBAL e não o Doctrine ORM, elas não poderão acessar o
getQuery()
método porque ele não existe. Eles precisam fazer algo como o seguinte.fonte
Para contar itens após algum número de itens (deslocamento), $ qb-> setFirstResults () não pode ser aplicado nesse caso, pois funciona não como uma condição de consulta, mas como um deslocamento do resultado da consulta para um intervalo de itens selecionados ( ou seja, setFirstResult não pode ser usado para reunir com COUNT). Então, para contar os itens restantes, fiz o seguinte:
Alguém sabe uma maneira mais limpa de fazer isso?
fonte
Adicionar o seguinte método ao seu repositório deve permitir que você chame
$repo->getCourseCount()
do seu Controller.fonte
Você também pode obter o número de dados usando a função de contagem.
fonte