Ich verwende den QueryBuilder von Doctrine, um eine Abfrage zu erstellen, und möchte die Gesamtzahl der Ergebnisse aus der Abfrage abrufen.
$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();
Ich möchte nur eine Zählung für diese Abfrage ausführen, um die Gesamtzahl der Zeilen zu erhalten, aber nicht die tatsächlichen Ergebnisse zurückgeben. (Nach dieser Zählabfrage werde ich die Abfrage mit maxResults für die Paginierung weiter ändern.)
symfony
doctrine-orm
Acyra
quelle
quelle
Antworten:
Etwas wie:
Einige Leute glauben, dass Ausdrücke irgendwie besser sind als nur DQL zu verwenden. Man ging sogar so weit, eine vier Jahre alte Antwort zu bearbeiten. Ich rollte seine Bearbeitung zurück. Stelle dir das vor.
quelle
bar = $bar
);)count()
on$query->getResult()
wird die Abfrage tatsächlich die Ergebnisse zurückgeben (was er nicht wollte). Ich denke, dies sollte akzeptiert werden Antwort$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
stattselect('count(account)')
?Hier ist eine andere Möglichkeit, die Abfrage zu formatieren:
quelle
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
Es ist besser, die gesamte Logik der Arbeit mit Datenbanken auf Repositores zu verschieben.
Also in Controller schreiben Sie
Und in
Repository/FooRepository.php
Es ist besser, in
$qb = ...
eine separate Zeile zu wechseln , wenn Sie komplexe Ausdrücke wie erstellen möchtenDenken Sie auch daran, Ihr Abfrageergebnis zwischenzuspeichern - http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
In einigen einfachen Fällen ist die Verwendung von
EXTRA_LAZY
Entitätsbeziehungen gut.Http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
quelle
Wenn Sie eine komplexere Abfrage zählen müssen, mit
groupBy
,having
etc ... Sie können ausleihen vonDoctrine\ORM\Tools\Pagination\Paginator
:quelle
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
eigentlich nichts Besonderes ist, aber eine bekannte COUNT (*)Da ist
Doctrine 2.6
es möglich,count()
Methode direkt von zu verwendenEntityRepository
. Details finden Sie unter dem Link.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
quelle
Beispiel für die Arbeit mit Gruppierung, Vereinigung und anderen Dingen.
Problem:
Damit dies funktioniert, besteht die mögliche Lösung darin, einen benutzerdefinierten Hydrator und dieses seltsame Ding namens "CUSTOM OUTPUT WALKER TIPP" zu verwenden:
quelle
Personen, die nur Doctrine DBAL und nicht Doctrine ORM verwenden, können nicht auf die
getQuery()
Methode zugreifen , da sie nicht vorhanden ist. Sie müssen so etwas wie das Folgende tun.quelle
$ Qb-> setFirstResults () kann in diesem Fall nicht angewendet werden, um Elemente nach einer bestimmten Anzahl von Elementen (Versatz) zu zählen, da dies nicht als Abfragebedingung, sondern als Versatz des Abfrageergebnisses für einen ausgewählten Elementbereich ( dh setFirstResult kann überhaupt nicht zum Sammeln mit COUNT verwendet werden. Um die verbleibenden Gegenstände zu zählen, habe ich einfach Folgendes getan:
Weiß jemand einen saubereren Weg, es zu tun?
quelle
Durch Hinzufügen der folgenden Methode zu Ihrem Repository sollten Sie
$repo->getCourseCount()
von Ihrem Controller aus aufrufen können.quelle
Sie können die Anzahl der Daten auch mithilfe der Zählfunktion abrufen.
quelle