Laravel 1 دقيقة للقراءة 1,197 مشاهدات

كيفية تحسين استعلامات Laravel Eloquent: إصلاح مشكلة N+1

تعلّم كيفية تحديد وإصلاح مشاكل استعلامات N+1 في Laravel مع التحميل المسبق وتحسين الاستعلامات.

Database optimization

المشكلة

// 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();
مشاركة هذه المقالة:
ES
كتبه

Edrees Salih

مهندس برمجيات متكامل يتمتع بخبرة 9 سنوات. شغوف ببناء حلول قابلة للتطوير ومشاركة المعرفة مع مجتمع المطورين.

عرض الملف الشخصي

التعليقات (0)

اترك تعليقًا

لن يتم نشر بريدك الإلكتروني.

لا توجد تعليقات بعد. كن أول من يشارك أفكاره!

مقالات ذات صلة

مقالات ذات صلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.