المشكلة
// This causes N+1 queries!
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name; // Query for EACH post
}
100 مقالة = 101 استعلام في قاعدة البيانات!
الحل: التحميل المُسبق (Eager Loading)
التحميل المُسبق الأساسي
// Only 2 queries now!
$posts = Post::with('author')->get();
foreach ($posts as $post) {
echo $post->author->name; // No extra query
}
تحميل علاقات متعددة
$posts = Post::with(['author', 'comments', 'tags'])->get();
تحميل العلاقات المتداخلة
$posts = Post::with('comments.user')->get();
التحميل المُسبق المشروط
$posts = Post::with(['comments' => function ($query) {
$query->where('approved', true)
->orderBy('created_at', 'desc');
}])->get();
اكتشاف مشاكل N+1
الطريقة الأولى: شريط أدوات Laravel للتصحيح
composer require barryvdh/laravel-debugbar --dev
الطريقة الثانية: منع التحميل الكسول
// AppServiceProvider.php
public function boot()
{
Model::preventLazyLoading(!app()->isProduction());
}
الطريقة الثالثة: سجل الاستعلامات
DB::enableQueryLog();
// Your code here
dd(DB::getQueryLog());
نصائح إضافية لتحسين الأداء
// Select only needed columns
Post::with('author:id,name')->select('id', 'title', 'author_id')->get();
// Use lazy eager loading when needed
$posts = Post::all();
if ($needAuthors) {
$posts->load('author');
}
// Count without loading
$post->comments()->count();
// Instead of
$post->comments->count();
التعليقات (0)
اترك تعليقًا
لا توجد تعليقات بعد. كن أول من يشارك أفكاره!