2011-11-22 12 views

Respuesta

38

es necesario ejecutar DQL hacer algo que desea.

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


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

Esta es una solución pobre + no funciona en Symfony2 más nuevo - en su lugar, use la respuesta siguiente. – thorinkor

18

ejecutar la consulta a continuación, obtener los resultados. Cuando tenga los resultados, se obtiene el número de registro haciendo una count en los resultados:

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

Si usted está preocupado con paginación, como conseguir 25 registros de un total. Entonces, tienes dos opciones.

  • de realizar la consulta dos veces, una vez para obtener resultados totales, otra vez para recuperar sólo 25 resultados utilizando el método setFirstResult y setMaxResults. Este método setFirstResult le permite establecer el desplazamiento y el segundo, setMaxResults, número de registros. El siguiente código le dará resultados que van desde 25 hasta 50, es la segunda página si usa 25 registros por página.

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

  • Puede comprobar doctrina extensiones para Doctrine2 que tienen el apoyo paginador. Estas extensiones han sido creadas por uno de los desarrolladores de Doctrine2. Puede revisar estos here.

Hope this help.

Saludos,
Matt

+2

@Reuven respuesta es un poco mejor, para la parte de la cuenta, ya que utiliza la función 'COUNT' interna del gestor de base de datos. Es mejor porque los resultados no se transfieren para obtener el conteo. Mis otros comentarios todavía se aplican. – Matt

+0

Gracias. Supongo que mi respuesta es mejor solo si solo necesitas el conteo y no los objetos. – Reuven

+0

te refieres a setFirstResult – jeremymarc

29

Creo que se puede hacer algo así:

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

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

Esta es una gran respuesta porque creo que solo requiere una consulta de base de datos. – Acyra

6

Creo que esto es tan conciso como se pone:

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

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

Dónde $repo es de tipo Doctrine\ORM\EntityRepository

-1

¿Por qué no usar la función php count()?

Como doctrine devuelve una matriz que contiene todos sus resultados, puede obtener fácilmente el número de filas devuelto por su solicitud.

Tan simple como eso:

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

Dónde $query es la variable que se utiliza para crear su consulta doctrina.

Enlace a la documentación de PHP: http://php.net/manual/en/function.count.php

+2

Nunca debe cargar todos los datos si solo necesita el conteo. Mejor deje que el DB maneje el conteo por usted. Si el conjunto de resultados es masivo, tu rendimiento sufrirá mal, mientras que todo lo que necesitas es un resultado entero. – Koen

Cuestiones relacionadas