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 :
- Prévenir le lazy loading (chargement paresseux) qui génère des requêtes multiples et inutiles
- Charger automatiquement toutes les relations nécessaires sans avoir à les lister manuellement
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
- Performance : Réduction drastique du nombre de requêtes SQL
- Simplicité : Plus besoin de lister manuellement les relations
- Sécurité : Fini les oublis de relations et les erreurs de frappe
- Intégration : Fonctionne nativement avec le système de cache, de validation et les outils d’analyse comme Telescope
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

Finis le N+1 et Vive l’Autoloading !
L’autoloading Eloquent de Laravel 12.8 élimine le N+1 et optimise vos requêtes automatiquement.

Laravel Jutsu

Laravel 9 est disponible !
Après une petite attente supplémentaire elle est là ! La version 9 de Laravel est dispo avec son lot de fonctionnalités à découvrir !

William Suppo

Démystifier la fonction defer()
La fonction defer() a attisé les passions récemment, ouvrons le capot pour découvrir ce qui s'y cache !

Laravel Jutsu