التحميل المسبق ونطاقات الاستعلام
امنعوا استعلامات N+1 باستخدام التحميل المسبق وأعيدوا استخدام المنطق عبر نطاقات الاستعلام
التحميل المسبق ونطاقات الاستعلام درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
مشكلة N+1
ينفّذ التحميل الكسول استعلامًا واحدًا لكل نموذج عند الوصول إلى علاقة داخل حلقة، ما يسبب تدهورًا كارثيًا في الأداء على نطاق واسع.
<?php
$posts = Post::all(); // 1 query
foreach ($posts as $post) {
echo $post->author->name; // 1 query per post = N+1 total!
}التحميل المسبق باستخدام with()
حل مشكلة N+1 بتحميل العلاقات مسبقًا في استعلام إضافي واحد.
<?php
$posts = Post::with("author")->get(); // 2 queries total
foreach ($posts as $post) {
echo $post->author->name; // no extra query
}التحميل المسبق لعدة علاقات
حمّل عدة علاقات في الوقت نفسه.
<?php
$posts = Post::with(["author", "tags", "comments"])->get();التحميل المسبق المتداخل
حمّل العلاقات المتداخلة باستخدام الصيغة النقطية.
<?php
$posts = Post::with("comments.author")->get();
// Loads posts, their comments, and each comment's authorالتحميل المسبق المقيّد
طبّق شروطًا على العلاقة التي جرى تحميلها مسبقًا.
<?php
$posts = Post::with(["comments" => function ($q) {
$q->where("approved", true)->latest();
}])->get();withCount()
حمّل عدد النماذج المرتبطة من دون تحميل النماذج المرتبطة نفسها.
<?php
$posts = Post::withCount("comments")->get();
foreach ($posts as $post) {
echo $post->comments_count;
}التحميل المسبق الكسول (load())
حمّل العلاقات مسبقًا في Collection جرى استرجاعها بالفعل باستخدام load().
<?php
$posts = Post::all();
// Later, when you know you need the authors:
$posts->load("author");نطاقات الاستعلام العامة
تضيف النطاقات العامة قيودًا تلقائيًا إلى جميع الاستعلامات الخاصة بنموذج.
<?php
class PublishedScope implements \Illuminate\Database\Eloquent\Scope {
public function apply(Builder $builder, Model $model): void {
$builder->where("is_published", true);
}
}نطاقات الاستعلام المحلية
النطاقات المحلية قيود استعلام قابلة لإعادة الاستخدام، تُعرَّف في النموذج على هيئة طرق تبدأ بالبادئة scope.
<?php
class Post extends Model {
public function scopePublished(Builder $query): void {
$query->where("is_published", true);
}
public function scopeByUser(Builder $query, int $userId): void {
$query->where("user_id", $userId);
}
}
// Usage:
Post::published()->byUser(1)->latest()->get();دمج النطاقات
سلسِل عدة نطاقات محلية لإنشاء منطق استعلام واضح وقابل لإعادة الاستخدام.
<?php
$posts = Post::published()
->byUser(auth()->id())
->orderBy("created_at", "desc")
->paginate(15);اكتشاف مشكلة N+1 أثناء التطوير
استخدم Laravel Debugbar أو شغّل DB::enableQueryLog() لاكتشاف أعداد الاستعلامات غير المتوقعة أثناء التطوير.
الملخص
استخدم with() لتحميل العلاقات مسبقًا والقضاء على استعلامات N+1. استخدم withCount() للحصول على الأعداد. وعرّف نطاقات محلية لإنشاء قيود استعلام قابلة لإعادة الاستخدام وواضحة.
تحقّق سريعًا
ما الطريقة التي تحمّل النماذج المرتبطة مسبقًا لحل مشكلة N+1؟
الأسئلة الشائعة
هل درس «التحميل المسبق ونطاقات الاستعلام» مجاني؟
نعم — نص درس «التحميل المسبق ونطاقات الاستعلام» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحميل المسبق ونطاقات الاستعلام»؟
امنعوا استعلامات N+1 باستخدام التحميل المسبق وأعيدوا استخدام المنطق عبر نطاقات الاستعلام تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التحميل المسبق ونطاقات الاستعلام»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نماذج Eloquent وعمليات الترحيل
- عمليات CRUD باستخدام Eloquent
- علاقات Eloquent
- التحميل المسبق ونطاقات الاستعلام