العودة للمدونة
laravelنُشر في September 20, 2026 · 3 دقيقة قراءة

N+1 Queries — كيف تكتشفها قبل أن يكتشفها العميل

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

N+1 Queries — كيف تكتشفها قبل أن يكتشفها العميل

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. لا تنتظر العميل حتى يكتشف البطء.

مصدر إضافي

#Laravel #N+1 Queries #Eloquent #Eager Loading #Lazy Loading #Laravel Telescope #Database Performance
لنتواصل

هل لديك مشروع في بالك؟

أنا متاح للعمل الحر والتعاون. لنصنع شيئاً رائعاً معاً.

النشرة البريدية

أفكار مفيدة تصل مباشرة إلى بريدك

رسائل مختصرة من حين لآخر عن Laravel وNuxt والذكاء الاصطناعي وبناء منتجات رقمية أفضل، دون إزعاج.

Logo
akramdev

قضيت أكثر من 9 سنوات في بناء تطبيقات Laravel وأنظمة الأعمال والخدمات الخلفية التي تعتمد عليها.

تواصل معي

© 2026 Akram Ghaleb · جميع الحقوق محفوظة

بُني بواسطة