J'utilise QueryBuilder de Doctrine pour construire une requête, et je veux obtenir le nombre total de résultats de la requête.
$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();
Je veux simplement exécuter un décompte sur cette requête pour obtenir le nombre total de lignes, mais pas renvoyer les résultats réels. (Après cette requête de comptage, je vais modifier davantage la requête avec maxResults pour la pagination.)
symfony
doctrine-orm
Acyra
la source
la source
Réponses:
Quelque chose comme:
Certaines personnes pensent que les expressions sont en quelque sorte meilleures que l'utilisation d'un DQL simple. On est même allé jusqu'à modifier une réponse vieille de quatre ans. J'ai annulé son montage. Allez comprendre.
la source
bar = $bar
);)count()
on$query->getResult()
fait en fait que la requête retourne les résultats (ce qu'il ne voulait pas ). je pense que cela devrait être accepté réponse$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
placeselect('count(account)')
?Voici une autre façon de formater la requête:
la source
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
Il est préférable de déplacer toute la logique de travail avec la base de données vers les référentiels.
Donc, dans le contrôleur, vous écrivez
Et en
Repository/FooRepository.php
Il est préférable de passer
$qb = ...
à une ligne distincte au cas où vous voudriez créer des expressions complexes commePensez également à mettre en cache le résultat de votre requête - http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
Dans certains cas simples, utiliser des
EXTRA_LAZY
relations d'entité est une bonnechose http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
la source
Si vous devez compter une requête plus complexe, avec
groupBy
,having
etc ... Vous pouvez emprunter àDoctrine\ORM\Tools\Pagination\Paginator
:la source
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
ce qui n'est en fait rien de spécial mais une solution COUNT (*) bien connuePuisqu'il
Doctrine 2.6
est possible d'utiliser lacount()
méthode directement depuisEntityRepository
. Pour plus de détails, voir le lien.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
la source
Exemple de travail avec groupement, union et autres.
Problème:
Pour que cela fonctionne, la solution possible consiste à utiliser un hydrateur personnalisé et cette chose étrange appelée «CONSEIL DE MARCHE DE SORTIE PERSONNALISÉE»:
la source
Pour les personnes qui utilisent uniquement Doctrine DBAL et non pas Doctrine ORM, elles ne pourront pas accéder à la
getQuery()
méthode car elle n'existe pas. Ils doivent faire quelque chose comme ce qui suit.la source
Pour compter les éléments après un certain nombre d'éléments (décalage), $ qb-> setFirstResults () ne peut pas être appliqué dans ce cas, car il ne fonctionne pas comme condition de requête, mais comme décalage du résultat de la requête pour une plage d'éléments sélectionnés ( c'est-à-dire que setFirstResult ne peut pas du tout être utilisé avec COUNT). Donc, pour compter les éléments qui restent, j'ai simplement fait ce qui suit:
Quelqu'un sait comment le faire de façon plus propre?
la source
L'ajout de la méthode suivante à votre référentiel devrait vous permettre d'appeler
$repo->getCourseCount()
depuis votre contrôleur.la source
Vous pouvez également obtenir le nombre de données en utilisant la fonction de comptage.
la source