Korzystam z QueryBuilder Doctrine do zbudowania zapytania i chcę uzyskać całkowitą liczbę wyników z zapytania.
$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();
Chcę tylko przeliczyć na to zapytanie, aby uzyskać całkowitą liczbę wierszy, ale nie zwracam rzeczywistych wyników. (Po tym zapytaniu zliczającym zamierzam dalej zmodyfikować zapytanie za pomocą maxResults do paginacji).
symfony
doctrine-orm
Acyra
źródło
źródło
Odpowiedzi:
Coś jak:
Niektórzy ludzie uważają, że wyrażenia są w jakiś sposób lepsze niż zwykłe używanie DQL. Jeden posunął się nawet do edycji czteroletniej odpowiedzi. Wycofałem jego edycję. Domyśl.
źródło
bar = $bar
);)count()
on$query->getResult()
powoduje, że zapytanie zwraca wyniki (czego nie chciał). Myślę, że to powinno być zaakceptowane odpowiedź$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
zamiastselect('count(account)')
?Oto inny sposób sformatowania zapytania:
źródło
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
Lepiej przenieść całą logikę pracy z bazą danych do repozytoriów.
Więc w kontrolerze piszesz
I w
Repository/FooRepository.php
Lepiej jest przejść
$qb = ...
do osobnego wiersza na wypadek, gdybyś chciał utworzyć złożone wyrażenia takie jakPomyśl także o buforowaniu wyniku zapytania - http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
W niektórych prostych przypadkach
EXTRA_LAZY
dobrze jest używać relacji encjihttp://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
źródło
Jeśli potrzebujesz policzyć bardziej złożone zapytanie, za pomocą
groupBy
,having
itp ... Możesz pożyczyć odDoctrine\ORM\Tools\Pagination\Paginator
:źródło
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
które w rzeczywistości nie jest niczym specjalnym, ale dobrze znane COUNT (*) rozwiązaniePonieważ
Doctrine 2.6
możliwe jest użyciecount()
metody bezpośrednio zEntityRepository
. Aby uzyskać szczegółowe informacje, patrz link.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
źródło
Przykład pracy z grupowaniem, związkami i innymi rzeczami.
Problem:
Aby to zadziałało, możliwym rozwiązaniem jest użycie niestandardowego nawilżacza i tej dziwnej rzeczy zwanej „WSKAZANIE NIESTANDARDOWEJ WALKERA”:
źródło
W przypadku osób, które używają tylko Doctrine DBAL, a nie Doctrine ORM, nie będą mogły uzyskać dostępu do
getQuery()
metody, ponieważ ona nie istnieje. Muszą zrobić coś takiego:źródło
Aby policzyć elementy po pewnej liczbie elementów (przesunięcie), w tym przypadku nie można zastosować $ qb-> setFirstResults (), ponieważ nie działa to jako warunek zapytania, ale jako przesunięcie wyniku zapytania dla wybranego zakresu elementów ( tj. setFirstResult nie może być w ogóle używany z COUNT). Aby policzyć pozostałe rzeczy, po prostu wykonałem następujące czynności:
Czy ktoś wie, jak to zrobić w bardziej czysty sposób?
źródło
Dodanie następującej metody do repozytorium powinno pozwolić na wywołanie
$repo->getCourseCount()
z kontrolera.źródło
Możesz także uzyskać liczbę danych, używając funkcji zliczania.
źródło