PHP
Efficient Eager Loading with Specific Columns and Nested Relations
Optimize Eloquent queries by eager loading only necessary columns from related models, including nested relationships, to reduce memory usage and improve performance.
use App\Models\User;
use App\Models\Post;
// Eager load posts and their comments, selecting specific columns
$users = User::with(['posts:id,title,user_id', 'posts.comments:id,body,post_id'])->get();
// Eager load posts with constraints and specific columns, then their comments
$usersWithFilteredPosts = User::with(['posts' => function ($query) {
$query->select('id', 'title', 'user_id')->where('is_published', true);
}, 'posts.comments'])->get();
// Example of accessing data
foreach ($users as $user) {
echo "User: {$user->name}
";
foreach ($user->posts as $post) {
echo " Post: {$post->title}
";
foreach ($post->comments as $comment) {
echo " Comment: {$comment->body}
";
}
}
}
How it works: This snippet demonstrates how to optimize Eloquent's eager loading. By specifying `relation:id,column1,column2`, you instruct Eloquent to retrieve only those columns from the related table, significantly reducing the dataset size. It also shows how to apply additional query constraints to the eager loaded relationship using a closure, ensuring you only load relevant related data.