Doctrine2: Paginator

A partir de la versión 2.2 de Doctrine, podemos encontrarnos la clase Paginator para paginar consultas DQL. Esta clase nos va a permitir, principalmente, paginar las consultas DQL en las que usamos fetch-join.

Las consultas con fetch-join son aquellas que además de hacer el join, en el resultado devolvemos la entidad relacionada, es decir:

Con esto hacemos que con sólo una consulta, podamos recuperamos los usuarios y sus direcciones sin tener que hacer consultas extra. El problema está cuando queremos limitar el número de resultados:

If your query contains a fetch-joined collection specifying the result limit methods are not working as you would expect. Set Max Results restricts the number of database result rows, however in the case of fetch-joined collections one root entity might appear in many rows, effectively hydrating less than the specified number of results.

Para esto, podemos usar la clase Paginator como indica la documentación:

También hay veces que en proyectos siempre vamos a paginar cosas como la que acabamos de ver, para este tipo de cosas no hace falta usar bundles que paginen por cualquier cosa. Con la clase Paginator podemos hacer algo así:

Y si queremos ver el número total de items y de páginas: