N+1 Queries — كيف تكتشفها قبل أن يكتشفها العميل
صفحتك تعمل لكن عدد الـ Queries يزيد بدون ما تنتبه؟ تعرّف على مشكلة N+1 وكيف تكتشفها وتعالجها في Laravel قبل وصولها إلى production.

N+1 Queries — كيف تكتشفها قبل أن يكتشفها العميل
الصفحة عندك سريعة وكل شيء تمام… وبعد ما تزيد البيانات يبدأ العميل يلاحظ البطء.
غالبًا المشكلة ليست Query ثقيلة، بل Query صغيرة تتكرر مع كل سجل. هذه هي مشكلة N+1.
كيف تحدث المشكلة؟
لو كنت تعرض الطلبات مع اسم العميل:
$orders = Order::latest()->get();
foreach ($orders as $order) {
echo $order->customer->name;
}
Laravel سينفذ Query للطلبات، ثم Query إضافية لكل عميل. يعني 100 طلب قد تشغّل 101 Query بدون أي error.
الحل
حمّل العلاقة من البداية باستخدام with():
$orders = Order::with('customer')
->latest()
->get();
بدل 101 Query، سيحتاج Laravel غالبًا Query للطلبات وQuery للعملاء.
كيف تكتشفها؟
افتح الـ request في Laravel Telescope أو Debugbar وراقب عدد الـ Queries. إذا وجدت نفس الاستعلام يتكرر مع اختلاف id فقط، راجع العلاقات المستخدمة داخل الـ loop.
ولتكتشف المشكلة مباشرة أثناء التطوير، أضف هذا داخل AppServiceProvider:
use Illuminate\Database\Eloquent\Model;
public function boot(): void
{
Model::preventLazyLoading(! $this->app->isProduction());
}
الآن Laravel سيعطيك Exception عند استخدام علاقة غير محمّلة مسبقًا.
لكن لا تضف with() لكل العلاقات احتياطًا. حمّل فقط ما تحتاجه الصفحة. وإذا كنت تحتاج العدد فقط، استخدم withCount():
$posts = Post::withCount('comments')->get();
الخلاصة
راقب عدد الـ Queries أثناء التطوير، استخدم with() للعلاقات المطلوبة، وفعّل preventLazyLoading. لا تنتظر العميل حتى يكتشف البطء.