Pagination Laravel : différences entre paginate(), simplePaginate() et cursorPaginate(), affichage dans Blade, réponses API et personnalisation des URL.
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.
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.
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.
// orderBy est obligatoire$users = DB::table('users')->orderBy('id')->cursorPaginate(15);$users = User::where('active', true)->cursorPaginate(15);
Les URL générées contiennent une chaîne de curseur au lieu d’un numéro de page.
-- paginate() / simplePaginate() — utilise OFFSETSELECT * FROM users ORDER BY id ASC LIMIT 15 OFFSET 15;-- cursorPaginate() — utilise WHERE (bénéficie des index)SELECT * FROM users WHERE id > 15 ORDER BY id ASC LIMIT 15;
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 ».
Pour envelopper le résultat de paginate() dans une collection de resource API, passez-le à UserResource::collection().
use App\Http\Resources\UserResource;use App\Models\User;Route::get('/api/users', function () { $users = User::paginate(15); return UserResource::collection($users);});
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.
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.
use Illuminate\Pagination\Paginator;public function boot(): void{ Paginator::defaultView('vendor.pagination.custom'); Paginator::defaultSimpleView('vendor.pagination.simple-custom');}
$paginator = User::paginate(15);$paginator->currentPage(); // Numéro de la page courante$paginator->lastPage(); // Dernière page (indisponible avec simplePaginate)$paginator->total(); // Total (indisponible avec simplePaginate)$paginator->perPage(); // Nombre par page$paginator->count(); // Nombre d'éléments sur la page courante$paginator->firstItem(); // Numéro du premier élément$paginator->lastItem(); // Numéro du dernier élément$paginator->hasPages(); // Y a-t-il plusieurs pages ?$paginator->hasMorePages(); // Y a-t-il une page suivante ?$paginator->onFirstPage(); // Est-ce la première page ?$paginator->onLastPage(); // Est-ce la dernière page ?$paginator->nextPageUrl(); // URL de la page suivante$paginator->previousPageUrl(); // URL de la page précédente$paginator->url(3); // URL de la page 3$paginator->items(); // Tableau des éléments de la page courante
cursorPaginate() — Grands volumes, défilement infini, écritures fréquentes (meilleures performances).
Pattern d'affichage Blade
@foreach ($users as $user) <p>{{ $user->name }}</p>@endforeach{{ $users->links() }}
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.
Pagination pour une API
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.