Skip to main content

Qu’est-ce que la pagination

La pagination de Laravel est intégrée au query builder et à l’ORM Eloquent : aucune configuration n’est nécessaire. La page courante est extraite automatiquement du paramètre page de la requête HTTP et ajoutée aux liens générés. Le HTML par défaut est compatible avec Tailwind CSS ; Bootstrap est aussi disponible.

Trois types de pagination

Utilisation de base

Pagination du query builder

Pagination Eloquent

simplePaginate

Si la requête COUNT(*) du total n’est pas nécessaire (uniquement liens « précédent »/« suivant »), utilisez simplePaginate() pour plus d’efficacité.
Si vous n’avez pas besoin d’afficher « X sur Y », choisissez simplePaginate(). paginate() exécute une requête COUNT(*) supplémentaire, donc simplePaginate() est plus rapide.

cursorPaginate (pagination par curseur)

La pagination par curseur remplace OFFSET par une clause WHERE, ce qui offre de bonnes performances pour de grandes quantités de données. Idéale pour les UI en défilement infini.
Les URL générées contiennent une chaîne de curseur au lieu d’un numéro de page.
La pagination par curseur exige orderBy. De plus, la colonne d’ordre doit appartenir à la table paginée.

Comparaison OFFSET vs. curseur

La pagination par curseur exploite bien les index, et évite les doublons/oublis lorsque les données sont modifiées fréquemment. En revanche, elle ne propose pas de liens numérotés, seulement « Précédent » / « Suivant ».

Implémentation dans un contrôleur

Affichage des liens de pagination dans Blade

La méthode links() génère automatiquement le HTML des liens. Par défaut, trois pages avant et trois pages après la page courante sont affichées.

Ajuster le nombre de liens affichés

onEachSide() permet de modifier le nombre de liens de chaque côté.

Nombre d’éléments par page passé par la requête

Plusieurs paginateurs sur la même page

Si deux paginateurs cohabitent, ils entreront en conflit sur le paramètre page. Renommez-le via le troisième argument.

Personnalisation de l’URL

Modifier l’URL de base

Ajouter des paramètres de requête

Ajouter un fragment de hachage

Réponse API (JSON)

Retourner un paginateur directement depuis une route ou un contrôleur le convertit automatiquement en JSON.
Format JSON de la réponse :

Combinaison avec les API Resources

Pour envelopper le résultat de paginate() dans une collection de resource API, passez-le à UserResource::collection().
Les informations de pagination sont automatiquement ajoutées comme métadonnées.
Le JSON de cursorPaginate() contient next_cursor et prev_cursor au lieu de numéros de page. Le client API doit renvoyer ces valeurs dans le paramètre cursor de la requête suivante.

Vues de pagination personnalisées

Spécifier la vue directement

Remplacer la vue par défaut

Publiez d’abord les vues officielles, puis personnalisez-les.
Les fichiers suivants sont générés dans resources/views/vendor/pagination/ :
  • tailwind.blade.php — Par défaut (Tailwind CSS)
  • bootstrap-5.blade.php — Bootstrap 5
  • simple-tailwind.blade.php — Pour simplePaginate
Modifiez tailwind.blade.php ou créez une nouvelle vue et déclarez-la dans AppServiceProvider.

Utiliser Bootstrap CSS

Pour utiliser Bootstrap au lieu de Tailwind, déclarez-le dans boot() du AppServiceProvider.

Créer manuellement un paginateur

Pour paginer des données existantes (par exemple un tableau), instanciez directement la classe.

Méthodes courantes de l’instance

Récapitulatif

  • paginate() — Quand vous avez besoin du total et des liens numérotés (liste standard).
  • simplePaginate() — Quand « Précédent » / « Suivant » suffit (plus rapide).
  • cursorPaginate() — Grands volumes, défilement infini, écritures fréquentes (meilleures performances).
Passez le résultat de paginate() à la vue et affichez les liens avec links(). La page courante est détectée automatiquement via le paramètre page.
Retourner directement un paginateur produit du JSON automatiquement. Combinez avec une API resource via UserResource::collection($paginator). La réponse contient data (tableau des enregistrements) et diverses métadonnées.
Dernière modification le 13 juillet 2026