I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

مشكلة N+1 في Laravel: ليه موقعك بطيء وإزاي تحل الكارثة دي؟

مشكلة N+1 في Laravel: ليه موقعك بطيء وإزاي تحل الكارثة دي؟ أكيد مريت بالموقف ده قبل كده: كتبت كود بسيط بيجيب بيانات من قاعدة البيانات، كل حاجة شغالة زي الفل في

مشكلة N+1 في Laravel: ليه موقعك بطيء وإزاي تحل الكارثة دي؟
Reading Count: 2

مشكلة N+1 في Laravel: ليه موقعك بطيء وإزاي تحل الكارثة دي؟

أكيد مريت بالموقف ده قبل كده: كتبت كود بسيط بيجيب بيانات من قاعدة البيانات، كل حاجة شغالة زي الفل في الـ Development، لكن أول ما الموقع بدأ يكبر شوية أو دخل عليه عدد مستخدمين معقول، لقيت الموقع بقى "تقيل" وبياخد وقت طويل عشان يحمل، ولما بتفتح الـ Debug Bar بتلاقي مئات الـ Queries اللي شغالة ورا بعضها. أهلاً بيك في عالم مشكلة N+1 Query Problem، دي واحدة من أكتر الحاجات اللي بتدمر أداء أي تطبيق بيستخدم Eloquent ORM في Laravel.

يعني إيه أصلاً N+1 Queries؟

تخيل إنك بتعرض قائمة فيها 20 بوست، وعايز تعرض اسم كاتب كل بوست. الكود بتاعك غالباً هيكون بالشكل ده:

$posts = Post::all();foreach ($posts as $post) { echo $post->user->name;}

هنا المشكلة بتبدأ. السطر Post::all() ده عبارة عن Query واحدة (الـ 1). ولما بتدخل في الـ Loop، إنت بتبعت Query جديدة لقاعدة البيانات عشان تجيب بيانات الـ User المرتبط بكل بوست. لو عندك 20 بوست، هتعمل 20 Query إضافية. فبقى عندك 1 + 20 = 21 Query! لو عندك 1000 بوست، هتضرب قاعدة البيانات بـ 1001 Query. ده اللي بنسميه N+1.

ليه دي كارثة حقيقية؟

قاعدة البيانات (Database) هي أبطأ جزء في أي تطبيق. كل Query بتاخد وقت عشان الـ Latency والـ Connection Overhead. لما بتبعت مئات الـ Queries في صفحة واحدة، إنت حرفياً بتخلي السيرفر "يغرق" في طلبات متكررة كان ممكن تخلص في طلب أو طلبين بالكتير. ده بيؤدي لزيادة الـ Response Time وبيموت الـ Scalability بتاعة مشروعك.

الحل السحري: الـ Eager Loading

عشان تحل المشكلة دي، Laravel وفرت لنا حاجة عبقرية اسمها Eager Loading. الفكرة ببساطة إننا بنقول لـ Eloquent: "يا ريت تجيبلي الـ Posts ومعاهم الـ Users بتوعهم من البداية". ده بيتم عن طريق الميثود with().

عدل الكود بتاعك ليصبح كده:

$posts = Post::with('user')->get();foreach ($posts as $post) { echo $post->user->name;}

هنا Laravel هتعمل حاجتين بس:

  • الأولى: SELECT * FROM posts;
  • الثانية: SELECT * FROM users WHERE id IN (1, 2, 3, ...);
كده مهما كان عدد البوستات، إنت هتعمل 2 Query بس! الأداء هيتحسن بشكل رهيب والموقع بتاعك هيكون صاروخ.

إزاي تكتشف المشكلة قبل ما تطلع للـ Production؟

أحسن نصيحة لأي حد شغال بـ Laravel هي استخدام أدوات زي Laravel Debugbar أو Laravel Telescope. دول هيوروك بالضبط عدد الـ Queries اللي اتنفذت في كل صفحة. كمان في طريقة تانية جامدة جداً، وهي إنك تخلي Laravel يرمي "Error" لو حصل N+1، وده عن طريق إضافة السطر ده في ملف AppServiceProvider داخل الميثود boot:

\Illuminate\Database\Eloquent\Model::preventLazyLoading(! app()->isProduction());

الكود ده بيمنعك تماماً إنك تعمل Lazy Loading في بيئة التطوير، ولو نسيت تستخدم with()، البرنامج هيوقف ويقولك خد بالك إنت بتعمل مشكلة N+1!

نصيحة من أخ لمبرمج

يا صاحبي، الشطارة مش بس في كتابة الكود اللي بيشتغل، الشطارة في كتابة الكود اللي "بيستحمل". اتعود دايماً تبص على الـ Query Log بتاعك، وما تسيبش الـ Relations تشتغل من غير ما تكون عارف هي بتجيب البيانات إزاي. Eager Loading هي صديقك الصدوق، استخدمها دايماً لما تكون عارف إنك هتحتاج بيانات مرتبطة ببعضها. طور مهاراتك في قراءة الـ Database Queries وهتفرق معاك جداً في مستوى شغلك.


Share

Related posts

Apr 19, 2026 • 1 min read
Reading Count: 10
مشكلة N+1 في Laravel: ليه موقعك بطيء وإزاي تحل الكارثة دي؟

مشكلة N+1 في Laravel: ليه موقعك بطيء وإزاي تحل الكارثة دي؟ أكيد مريت بالموقف ده قبل كدة: بتفتح لوحة...

May 23, 2025 • 1 min read
Reading Count: 582
FlyEnv - أداة إدارة بيئة تطوير متكاملة للمطورين

FlyEnv هي أداة شاملة لإدارة بيئات التطوير، بتسهل على المطورين التعامل مع إصدارات متعددة من لغات البر...

Apr 28, 2025 • 1 min read
Reading Count: 592
فهم نمط الـ Repository في Laravel: دليل شامل

تعلم كل ما تحتاج معرفته عن نمط الـ Repository في Laravel. هذا الدليل يشرح كيفية تنفيذه بفعالية، مميز...