Éliminer les N+1 queries en Laravel
Le problème N+1 est l'un des pièges de performance les plus courants avec Eloquent. Voici comment le détecter et l'éliminer.
Le problème
Quand vous faites Post::all() puis accédez à $post->author->name dans une boucle, Laravel exécute une requête par itération. Sur 100 articles, ça fait 101 requêtes.
La solution : Eager Loading
Post::with(['author', 'tags'])->get();
Une seule requête pour les posts, une pour les auteurs, une pour les tags. 3 au lieu de 101.
DB::listen pour détecter
DB::listen(function ($query) {
if ($query->time > 100) {
Log::warning('Slow query', ['sql' => $query->sql]);
}
});
Conclusion
Toujours eager load vos relations. Utilisez preventLazyLoading() en dev pour détecter automatiquement.