Laravel : utiliser la pagination pour afficher des résultats

Laravel est vraiment un framework très pratique et facile d’utilisation. La courbe de progression est vraiment rapide et en tant que débutant, il est possible de très vite faire de belles choses. Aujourd’hui nous allons voir comment utiliser la pagination proposée par défaut par Laravel.

Les raisons d’utiliser la pagination sont nombreuses voir indispensable dans certains cas. Les utilisateurs d’aujourd’hui s’attendent à accéder rapidement et facilement aux informations qu’ils recherchent, sans être submergés par des pages interminables de contenu. C’est là qu’intervient la pagination, une technique qui permet de diviser le contenu en sections plus petites et gérables.

L’utilisation de la pagination dans Laravel présente plusieurs avantages clé. Elle réduit la charge sur le serveur en limitant le nombre de requêtes et la quantité de données transférées à chaque demande. De plus, elle améliore la convivialité de l’application en permettant aux utilisateurs de parcourir le contenu de manière organisée, sans surcharge visuelle ni confusion.

Créer un système de pagination de base dans Laravel

Pour cette partie du tutoriel sur la pagination, on va commencer avec un exemple tout simple. Partons du principe que dans mon application Laravel, je veux afficher les abonnés de la newsletter d’un site. Pour cela, je vais commencer par récupérer les abonnés à l’aide d’un modèle puis utiliser la fonction paginate().

<?php
public function abonnes($siteId)
{
    $site = Site::findOrFail($siteId);
    $abonnes = $site->abonnes()->paginate(10);
    return view('sites.abonnes', compact('site', 'abonnes'));
}

Je renvoie ensuite, directement les résultats à la vue en utilisant au passage la fonction compact. Maintenant, il est temps de voir ce que l’on a du coté de cette vue abonnes.blade.php qui est dans le dossier sites. Pour afficher le résultat de cette pagination toute simple, j’utilise le contenu suivant dans ma vue :

@extends('layouts.app')

@section('content')
<div class="container">
    <h1 class="my-4">Abonnés du site: {{ $site->nom }}</h1>

    @if($abonnes->isEmpty())
        <div class="alert alert-info">Aucun abonné trouvé pour ce site.</div>
    @else
        <table class="table table-bordered">
            <thead>
                <tr>
                    <th>Email</th>
                    <th>Date d'inscription</th>
                    <th>Statut</th>
                </tr>
            </thead>
            <tbody>
                @foreach($abonnes as $abonne)
                    <tr>
                        <td>{{ $abonne->email }}</td>
                        <td>{{ $abonne->date_inscription }}</td>
                        <td>
                            @if($abonne->inscrit)
                                <span class="text-success">Inscrit</span>
                            @else
                                <span class="text-danger">Désinscrit</span>
                            @endif
                        </td>
                    </tr>
                @endforeach
            </tbody>
        </table>

        <!-- Liens de pagination -->
        {{ $abonnes->links('pagination::bootstrap-5') }}
    @endif
</div>
@endsection

La directive {{ $abonnes->links(‘pagination::bootstrap-5’) }} génère les liens de pagination en utilisant le style Bootstrap 5. Assurez-vous que Bootstrap 5 est correctement inclus dans votre projet pour que le style s’affiche correctement. Si vous utilisez Bootstrap 4 dans votre application Laravel, il faudra dans ce cas utiliser {{ $abonnes->links(‘pagination::bootstrap-4’) }}. Vous voyez l’idée comme ça.

Il est aussi possible d’utiliser la version toute simple {{ $abonnes->links() }}. Ce gabarit génère des liens de pagination basiques sans dépendance à un framework CSS spécifique. Cependant, les styles seront minimalistes et vous devrez peut-être ajouter vos propres styles CSS pour les adapter à votre application.

Utiliser cursorPaginate pour les grands ensembles de données

Si vous avez une énorme base de données, il est possible que la pagination au dessus soit un peu lente et c’est normal. Dans Laravel, la méthode la plus couramment utilisée pour la pagination est donc paginate() que nous avons vu juste au-dessus. Bien qu’elle soit adaptée pour des bases de données de petite à moyenne taille, elle peut rapidement devenir inefficace face à des tables volumineuses. La méthode cursorPaginate(), quant à elle, se présente comme une alternative plus performante, spécialement conçue pour les grandes bases de données. Il est essentiel de comprendre comment ces deux méthodes fonctionnent afin de choisir celle qui correspond le mieux à vos besoins.

Lorsque vous utilisez la pagination traditionnelle avec paginate(), Laravel effectue deux requêtes SQL principales. La première sert à récupérer les enregistrements de la page courante grâce aux commandes LIMIT et OFFSET. La seconde requête permet de compter le nombre total d’éléments dans la base de données pour déterminer le nombre total de pages disponibles. Cette approche fonctionne bien tant que la quantité de données reste raisonnable. Cependant, sur des bases de données volumineuses, l’utilisation d’OFFSET devient moins efficace, car elle oblige à parcourir un grand nombre d’enregistrements pour chaque page, ce qui ralentit considérablement les performances.

C’est ici que la méthode cursorPaginate() prend tout son sens. Contrairement à la pagination traditionnelle, cette méthode n’utilise pas d’OFFSET. À la place, elle repose sur un « curseur » qui permet de se déplacer de manière fluide et continue à travers les enregistrements. Ce curseur est généralement basé sur une colonne unique, comme id ou created_at, garantissant ainsi un tri stable des résultats. Cette approche permet d’optimiser les performances, en évitant le parcours inutile de nombreuses lignes.

La pagination par curseur présente également d’autres avantages. Elle est non seulement plus rapide, mais elle réduit aussi le risque d’incohérence dans les données paginées. Par exemple, avec la méthode traditionnelle, si des enregistrements sont ajoutés ou supprimés entre deux pages, cela peut entraîner des résultats imprécis. La méthode cursorPaginate() minimise ces problèmes en offrant une pagination plus stable et fiable, même lorsque les données changent fréquemment.

Pour utiliser cette méthode cursorPaginate(), c’est très facile, et cela, ne nécessite pas beaucoup de modifications par rapport à ce que nous avons vu précédemment. Cette fois, on va aller chercher les données de cette manière avec cursorPaginate() :

<?php 
public function abonnes($siteId)
{
    $site = Site::findOrFail($siteId);
    $abonnes = $site->abonnes()->orderBy('id')->cursorPaginate(10);
    return view('sites.abonnes', compact('site', 'abonnes'));
}

Du côté de la vue, il faut cette fois gérer manuellement la pagination, mais rassurez vous, c’est assez simple. Voici un exemple dans ma vue en utilisant les curseurs :

<nav aria-label="Pagination" class="d-flex justify-content-center mt-4">
    <ul class="pagination">
        {{-- Lien Précédent --}}
        @if ($abonnes->onFirstPage())
            <li class="page-item disabled">
                <span class="page-link">&laquo; Précédent</span>
            </li>
        @else
            <li class="page-item">
                <a class="page-link" href="{{ $abonnes->previousPageUrl() }}" rel="prev">&laquo; Précédent</a>
            </li>
        @endif

        {{-- Lien Suivant --}}
        @if ($abonnes->hasMorePages())
            <li class="page-item">
                <a class="page-link" href="{{ $abonnes->nextPageUrl() }}" rel="next">Suivant &raquo;</a>
            </li>
        @else
            <li class="page-item disabled">
                <span class="page-link">Suivant &raquo;</span>
            </li>
        @endif
    </ul>
</nav>

Si vous travaillez avec une base de données contenant un grand nombre d’enregistrements, la méthode cursorPaginate() constitue une option bien plus performante que la pagination traditionnelle. J’espère que ce tutoriel sur la pagination dans Laravel vous sera utile et que vous allez pouvoir mieux présenter vos données grâce à cet article.

Laisser un commentaire