2012-03-06 20 views
11

Estoy usando Doctrine2 para un proyecto que podría generar mucho tráfico y estoy haciendo una paginación en la página de búsqueda y solo obtengo 5 resultados por página Entonces, ¿hay una buena manera de hacerlo sin la necesidad de utilizar la extensión de la doctrina y mantener la capa de abstracción de ORM? Me refiero a que no quiero escribir cualquier tipo de consultas DQL y mantener mi código en este formato:Uso de la paginación en Doctrine2/Symfony2 sin la extensión del paginador de Doctrine

$repo= $this->getDoctrine() 
        ->getEntityManager() 
        ->getRepository('AcmeOfficeBundle:Project'); 
     $list=$repo->findBy(array('PROJ_private' => "0")); 

Respuesta

35

Doctrina 2.2 ships with a paginator. Sin embargo, hace requiere que escriba consultas DQL.

Si insiste en no escribir ningún DQL, puede comenzar mirando la clase Doctrine EntityRepository; específicamente, the findBy() method. Tiene parámetros opcionales para el final y offset, para que pueda probar algo como esto (usando tu ejemplo como línea de base):

$num_pages = x; // some calculation of what page you're currently on 
$repo = $this->getDoctrine() 
       ->getRepository('AcmeOfficeBundle:Project'); 
$list = $repo->findBy(
    array('PROJ_private' => "0"), //search criteria, as usual 
    array(/* orderBy criteria if needed, else empty array */), 
    5, // limit 
    5 * ($num_pages - 1) // offset 
); 
+1

Thx por la parte de Doctrina 2.2 envío con un Paginator, no lo sabía. – Matt

+2

¿Cómo obtendré el número total de páginas para un conjunto de resultados? ¿Debo ejecutar findBy() sin los dos últimos parámetros para obtener el número total de resultados y luego calcularlo yo mismo? Parece ineficiente, pero no estoy seguro de si hay una forma más elegante de hacerlo. – imkingdavid

0

Una buena opción que evita escribiendo DQL es operar en colecciones utilizando Pagerfanta

https://github.com/whiteoctober/Pagerfanta

use Pagerfanta\Adapter\DoctrineCollectionAdapter; 
$user = $em->find("App\DoctrineORM\User", 1); 
$adapter = new DoctrineCollectionAdapter($user->getGroups()); 
0

en ORM de Doctrine 2.3 también se puede utilizar junto con Criteriamatching en el repositorio de entidad. Que ahora (a partir de 2.5) funciona con nToMany relaciones.

Esto ayuda cuando su consulta requiere otra comparación que no sea igual o al paginar una colección OneToMany de otra entidad.

$page = (isset($_GET['page']) && $_GET['page'] > 0 ? $_GET['page'] : 1); 
$limit = 20; 
$offset = ($limit * ($page - 1)); 
$criteria = \Doctrine\Common\Collections\Criteria::create() 
    ->setMaxResults($limit) 
    ->setFirstResult($offset); 
$expr = $criteria->expr(); 
$user = $em->getRepository('AcmeOfficeBundle:Project') 
    ->matching($criteria->where($expr->gt('PROJ_private', 0))); 
$total_records = $user->count(); 

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections

Cuestiones relacionadas