PHP
Optimize Queries with Eloquent Eager Loading
Prevent the N+1 query problem in Laravel Eloquent by eagerly loading relationships, drastically improving application performance and reducing database load.
// Bad practice: N+1 problem
$posts = App\Models\Post::all();
foreach ($posts as $post) {
echo $post->user->name; // Each user access makes a new query
}
// Good practice: Eager loading 'user' relationship
$postsWithUsers = App\Models\Post::with('user')->get();
foreach ($postsWithUsers as $post) {
echo $post->user->name; // All users loaded in a single query
}
// Eager loading multiple relationships
$postsWithCommentsAndTags = App\Models\Post::with(['comments', 'tags'])->get();
// Eager loading nested relationships
$postsWithUserAndUserProfile = App\Models\Post::with('user.profile')->get();
// Eager loading with constraints
$postsWithActiveComments = App\Models\Post::with(['comments' => function ($query) {
$query->where('is_active', true);
}])->get();
How it works: Eager loading using the `with()` method fetches all related models for a collection in a single additional query, rather than executing a separate query for each model. This technique, crucial for performance, eliminates the notorious N+1 query problem, making your application much faster and more efficient by reducing the number of database roundtrips. It can be applied to single, multiple, nested, and even constrained relationships.