2011-11-22 12 views

Odpowiedz

38

Trzeba wykonać DQL zrobić coś chcesz.

$query = $this->createQueryBuilder() 
       ->from('foo', 'f') 
       ->where('foo.bar = :id') 
       ->setParameter('id', $myID) 
       ->getQuery(); 


$total = $query->select('COUNT(f)') 
       ->getQuery() 
       ->getSingleScalarResult(); 
+5

To jest złe rozwiązanie + nie działa w nowszej wersji Symfony2 - zamiast tego użyj odpowiedzi poniżej. – thorinkor

18

Wykonujesz zapytanie, a następnie otrzymujesz wyniki. Gdy masz wyniki, masz numer rekordu wykonując count na wyniki:

$results = $query->getResult(); 
$resultCount = count($results); 

Jeśli dotyczy stronicowania, jak dostaję 25 rekordów z całości. Następnie masz dwie możliwości.

  • wykonywać kwerendy dwa razy, jeden raz, aby uzyskać całkowite wyniki, inny czas, aby odzyskać tylko 25 wyników przy użyciu metody setFirstResult i setMaxResults. Ta metoda umożliwia ustawienie przesunięcia i drugiej, setMaxResults, liczby rekordów. Poniższy kod daje wyniki od 25 do 50, to druga strona, jeśli używasz 25 rekordów po stronie.

    $query->setFirstResult(25);
    $query->setMaxResults(25);

  • Można sprawdzić doktryna rozszerzenia Doctrine2 które mają wsparcie paginator. Te rozszerzenia zostały wykonane przez jednego z twórców Doctrine2. Możesz przejrzeć te here.

Mam nadzieję, że ta pomoc.

Pozdrawiam,
Matt

+2

@Reuven odpowiedź jest nieco lepiej, dla części count, ponieważ wykorzystuje wewnętrzną funkcję 'COUNT' menedżera bazy danych. Jest to lepsze, ponieważ wyniki nie są przekazywane, aby uzyskać liczbę. Moje pozostałe komentarze nadal mają zastosowanie. – Matt

+0

Dzięki. Myślę, że moja odpowiedź jest lepsza tylko wtedy, gdy potrzebujesz tylko liczby, a nie przedmiotów. – Reuven

+0

masz na myśli setFirstResult – jeremymarc

29

myślę, że można zrobić coś takiego:

$query = $this->createQueryBuilder() 
    ->select('COUNT(f.id)') 
    ->from('foo', 'f') 
    ->where('foo.bar = :id') 
    ->setParameter('id', $myID) 
    ->getQuery(); 

$total = $query->getSingleScalarResult(); 
+0

To jest świetna odpowiedź, ponieważ myślę, że wymaga tylko jednego zapytania do bazy danych. – Acyra

6

myślę, że to jest tak zwięzły jak to się robi:

$qb = $repo->createQueryBuilder('entity'); 
$qb->select('COUNT(entity)'); 

$count = $qb->getQuery()->getSingleScalarResult(); 

Gdzie $repo jest typu Doctrine\ORM\EntityRepository

-1

Dlaczego nie korzystać z funkcji php count()?

Gdy doktryna zwróci tablicę zawierającą wszystkie wyniki, można łatwo uzyskać liczbę wierszy zwróconych przez żądanie.

Jako proste:

[...] // Your doctrine query 
$foo = $query->getResult(); 
$nbRow = count($foo); 

Gdzie $query jest zmienna użyć, aby utworzyć zapytanie doktryny.

Link do dokumentacji php: http://php.net/manual/en/function.count.php

+2

Nigdy nie powinieneś ładować wszystkich danych, jeśli potrzebujesz tylko liczby. Lepiej pozwól DB obsługiwać liczenie dla ciebie. Jeśli zestaw wyników jest ogromny, Twoje wyniki będą bardzo niekorzystne, a jedyne, czego potrzebujesz, to wynik całkowity. – Koen

Powiązane problemy