Symfony — Pagination d’une requête avec Doctrine
La pagination des résultats d’une requête est un besoin courant dans une application, pourtant cela peu parfois être un peu complexe lorsque cette dernière comprend des jointures.
Il existe un bundle Symfony très performant permettant de mettre en place de la pagination sur vos requête, il s’agit du KnpPaginatorBundle. Néanmoins dans cet article (et parce que cela répondait mieux au besoin que je rencontrais initialement) j’utiliserais plutôt la classe Paginator fournie avec Doctrine.
Tout d’abord nous allons créer notre requête de récupération d’entité (ici des Orders). Pour utiliser un Paginator je vous conseille de créer une méthode dans le Repository qui va gérer le QueryBuilder de cette requête.
Ensuite nous allons créer la méthode qui va nous permettre de gérer la récupération des résultats de la requête sous forme de pagination.
Initialement le Paginator ne fonctionne pas avec des pages. Il faut indiquer dans le QueryBuilder le 1er résultat à récupérer et le nombre maximum de résultat à récupérer.
De plus, pour pouvoir utiliser des jointures, nous devons mettre le second argument du constructeur Paginator à ‘true’.
Mais si vous préférez, vous pouvez facilement modifier la méthode pour retrouver directement la page voulue :
Maintenant nous pouvons utiliser la méthode getOrder() pour retrouver une liste d’Order correctement paginée .
Pour garder une séparation du code correcte, cette méthode ne se trouve pas dans le orderRepository. Elle peut se trouver dans le contrôleur ou dans un service.
Nous pouvons principalement utiliser notre résultat paginé de deux manières :
count($paginatedResult)
: Nous permet de récupérer le nombre total de résultatforeach($paginatedResult as $order){}
: Nous permet de parcourir les éléments de la page demandée.
Voilà, vous pouvez maintenant paginer facilement des requêtes doctrine même si celles-ci contiennent des jointures.
N’hésitez pas à me faire des retours sur cet article si celui-ci vous à plus ou si certains points vous ont semblés confus.