Vous souhaitez nous soutenir ? Devenez sponsor de l'association sur notre page Github
Actualités

Finis le N+1 et Vive l’Autoloading !

Laravel Jutsu avatar
Publié le 6 mai 2025
Couverture de l'article Finis le N+1 et Vive l’Autoloading !

L’autoloading des relations Eloquent est une nouveauté introduite dans Laravel 12.8 qui permet de charger automatiquement les relations associées à vos modèles, sans avoir à les spécifier manuellement à chaque requête. Cette fonctionnalité vise à éliminer le fameux problème du N+1 et à rendre votre code à la fois plus performant et plus lisible.

Si vous n'êtes pas certain.e de ce qu'est le problème du N+1 je vous invite à visionner ma vidéo qui vous apportera plus de détails avant de continuer votre lecture.

Dans cet article, je vous propose de découvrir ce nouveau fonctionnement. Ce sera aussi l’occasion de voir comment les développeurs du framework conçoivent des solutions élégantes à des problèmes courants.

Fonctionnalités principales

L’autoloading des relations Eloquent repose sur deux principes majeurs :

Cette fonctionnalité est très simple à mettre en place et ne vous exempt pas d'utiliser d'autres stratégies d'optimisation comme la mise en cache.

Exemple concret d'un classique : le N+1

Prenons l’exemple d’une application de gestion de livres. Vous souhaitez afficher une liste de livres avec leur auteur, leur éditeur, leurs catégories, etc.

Code naïf :

1$books = Book::all();
2return view('books.index', compact('books'));

Dans la vue :

1@foreach ($books as $book)
2 <h2>{{ $book->title }}</h2>
3 <p>Auteur : {{ $book->author->name }}</p>
4 <p>Éditeur : {{ $book->publisher->name }}</p>
5 <small>Catégorie : {{ $book->category->name }}</small>
6@endforeach

Problème :
Pour chaque livre, Eloquent va exécuter une requête supplémentaire pour chaque relation (auteur, éditeur, etc.). Avec 30 livres et 3 relations, cela peut générer plus de 90 requêtes !

Détection et prévention du lazy loading

Laravel propose une méthode pour empêcher le lazy loading et détecter ces problèmes :

1use Illuminate\Database\Eloquent\Model;
2 
3public function boot()
4{
5 Model::preventLazyLoading();
6}

Dès qu’un lazy loading est détecté, Laravel lève une exception, vous forçant à charger explicitement les relations.

Il est intéressant de noter que cette prévention peut faire corps également avec d'autres pour former le "Mode Strict" de Laravel qui permet de vous éviter certains déconvenues.

Eager loading classique

La solution historique : charger les relations avec with() :

1$books = Book::with(['author', 'publisher', 'category'])->get();

Mais il faut penser à lister toutes les relations à chaque fois, ce qui peut devenir fastidieux et source d’erreurs.

Nouveauté Laravel 12.8 : l’autoloading des relations

Désormais, il suffit d’utiliser la méthode withRelationshipAutoloading :

1$books = Book::withRelationshipAutoloading()->get();

Laravel va automatiquement charger toutes les relations nécessaires, sans que vous ayez à les spécifier.

Pour aller plus loin, vous pouvez activer l’autoloading globalement dans votre AppServiceProvider :

1use Illuminate\Database\Eloquent\Model;
2 
3public function boot()
4{
5 Model::shouldAutoEagerLoadRelationships();
6}

Avantages et architecture

Mot de la fin 🏗️

L’autoloading des relations Eloquent est un exemple parfait d’évolution intelligente du framework Laravel. Il s’intègre naturellement dans l’architecture existante, tout en offrant une solution élégante à un problème récurrent.

Grâce à cette nouveauté, votre code reste propre, performant et conforme aux standards Laravel. N’hésitez pas à mettre à jour vos projets pour en profiter dès aujourd’hui !

Pour aller plus loin, consultez la documentation officielle de Laravel et explorez les nouveautés de la version 12.8.

Source : https://laravel.com/docs/12.x/eloquent-relationships

A lire

Autres articles de la même catégorie