في هذا الدرس 6تصفّح المواضيع
تربط علاقة متعدد لمتعدد نموذجين معاً عبر جدول ربط وسيط يُعرف بجدول Pivot، مثل ربط المقالات والوسوم عبر جدول post_tag. يعرّف كلا النموذجين العلاقة باستخدام دالة belongsToMany، ويستنتج Eloquent اسم الجدول الوسيط تلقائياً بدمج اسمي النموذجين بصيغة المفرد وفق الترتيب الأبجدي الإنجليزي.
- التسمية الأبجدية للوسيط (Alphabetical Pivot): ربط نموذجي Post و Tag ينتج اسم الجدول post_tag لأن حرف P يسبق T أبجدياً.
- تعريف الطرفين (belongsToMany): يستدعي كلا النموذجين دالة belongsToMany للتنقل بين السجلات في الاتجاهين.
- تخصيص اسم الجدول (Custom Pivot Name): مرر اسم الجدول الوسيط كمعامل ثانٍ للدالة إذا كان يختلف عن الاصطلاح القياسي.
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
public function tags(): BelongsToMany
{
return $this->belongsToMany(Tag::class);
}
$tags = $post->tags;
يحصل كل نموذج يتم جلبه عبر علاقة متعدد لمتعدد تلقائياً على خاصية باسم pivot تمثل سجل الجدول الوسيط الذي ربط الطرفين. يحتوي كائن pivot افتراضياً على المفتاحين الأجنبيين فقط، لذا يجب إلحاق دالتي withPivot و withTimestamps بتعريف العلاقة لقراءة الأعمدة الإضافية والطوابع الزمنية.
- كائن السجل الوسيط (pivot Property): اقرأ بيانات صف الربط الوسيط مباشرة عبر الخاصية $tag->pivot أثناء الدوران على النتائج.
- تضمين الأعمدة الإضافية (withPivot): تحدد أسماء الأعمدة الإضافية في الجدول الوسيط ليقوم Eloquent بجلبها في الاستعلام.
- تحديث الطوابع الزمنية (withTimestamps): تتولى تعبئة وتحديث عمودي created_at و updated_at في الجدول الوسيط تلقائياً.
public function roles(): BelongsToMany
{
return $this->belongsToMany(Role::class)
->withPivot('assigned_by')
->withTimestamps();
}
$by = $user->roles->first()->pivot->assigned_by;
يوفر Eloquent دوال مخصصة على علاقة متعدد لمتعدد لإدراج أو إزالة أو مزامنة الصفوف داخل الجدول الوسيط. بينما تضيف دالة attach ارتباطات جديدة وتمسحها دالة detach، تقبل دالة sync مصفوفة معرفات وتضمن بقاء تلك المعرفات فقط في الجدول الوسيط دون أي تكرار.
- إضافة ارتباط (attach Method): تدرج سجلاً أو أكثر في الجدول الوسيط وتقبل تمرير قيم للأعمدة الإضافية عند الحاجة.
- فصل ارتباط (detach Method): تحذف معرفات محددة من الجدول الوسيط، أو تمسح كافة ارتباطات النموذج إذا استُدعيت بدون معاملات.
- المزامنة الشاملة (sync Method): مثالية لحفظ مربعات الاختيار في النماذج؛ تضيف المعرفات الجديدة وتحذف غير الموجودة في المصفوفة.
$post->tags()->attach(3, ['added_by' => 1]);
$post->tags()->detach([2, 4]);
$post->tags()->sync([1, 5, 8]);
عند استعلام النماذج الأب، كثيراً ما تحتاج لتصفية النتائج بناءً على وجود سجلات مرتبطة بها أو تحقق شروط معينة داخل تلك السجلات. تولد دوال has و doesntHave و whereHas في Eloquent استعلامات فرعية عالية الكفاءة بصيغة EXISTS لتصفية الآباء وفق علاقاتهم.
- شرط وجود علاقة (has Method): يجلب فقط النماذج الأب التي تمتلك سجلاً مرتبطاً واحداً على الأقل أو عدداً محدداً.
- تصفية مشروطة بالعلاقة (whereHas): يصفي النماذج الأب عبر تمرير دالة مغلقة تطبق شروطاً مخصصة على الجدول المرتبط.
- نفي وجود العلاقة (doesntHave): يستخرج السجلات الأب التي لا تمتلك أي سجلات فرعية أو وسيطة مرتبطة بها.
$taggedPosts = Post::has('tags', '>=', 2)->get();
$laravelPosts = Post::whereHas('tags', function ($q) {
$q->where('slug', 'laravel');
})->get();
تكمل علاقات متعدد لمتعدد ودوال مزامنة الجدول الوسيط واستعلامات فحص الوجود أدواتك الهندسية لتمثيل قواعد البيانات المعقدة في Eloquent. يمنع استخدام دالة sync عند تحديث الارتباطات ودالة withCount في صفحات القوائم تكرار الصفوف ويغني عن تحميل كائنات غير لازمة.
| وجه المقارنة الهندسي | الأسلوب اليدوي أو غير المحسن | معيار Laravel 12 الحديث |
|---|---|---|
| تحديث مربعات الاختيار | مسح كافة صفوف الربط يدوياً ثم الدوران لإضافة كل معرف | استدعاء دالة sync بسطر واحد لمزامنة المعرفات بدقة |
| قراءة بيانات الجدول الوسيط | تنفيذ استعلام منفصل ومباشر على جدول الربط الوسيط | إلحاق دالة withPivot وقراءة القيمة عبر الكائن pivot |
| التصفية بشرط في العلاقة | تحميل كافة المقالات للذاكرة وتصفيتها برمجياً في PHP | استخدام دالة whereHas لتنفيذ استعلام EXISTS فرعي بالقاعدة |
| عرض عدد السجلات المرتبطة | استدعاء count على العلاقة داخل حلقة العرض لكل صف | استخدام دالة withCount وقراءة الخاصية tags_count الجاهزة |
$post->tags()->sync($request->input('tags', []));
$popular = Post::has('tags')
->withCount('tags')
->get();
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس حول «علاقة متعدد لمتعدد والجداول الوسيطة Pivot في Eloquent» مفاهيم علاقة متعدد لمتعدد والجدول الوسيط، وقراءة أعمدة الجدول الوسيط Pivot، وربط وفصل ومزامنة السجلات وفق معايير Laravel 12 الحديثة.
الخطوة التالية والدرس القادم
انتقل الآن إلى الدرس التالي «التحميل المسبق وحل مشكلة استعلامات N Plus 1 في Eloquent» للبناء التراكمي على ما تعلمته.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Pivot Tables الجداول الوسيطة
- بناء علاقة متعدد لمتعدد عبر belongsToMany وقراءة أعمدة الجدول الوسيط وإدارة الارتباطات بـ attach و sync واستعلام العلاقات بـ whereHas و withCount.
- للمراجعة
- 02 Many to Many Pivot Tables علاقة متعدد لمتعدد والجدول الوسيط
- المفهوم الهندسي والتطبيق العملي المباشر لقسم علاقة متعدد لمتعدد والجدول الوسيط في إطار العمل Laravel 12.
- للمراجعة
- 03 Inspecting Extra Pivot Columns قراءة أعمدة الجدول الوسيط Pivot
- المفهوم الهندسي والتطبيق العملي المباشر لقسم قراءة أعمدة الجدول الوسيط Pivot في إطار العمل Laravel 12.
- للمراجعة
- 04 Attaching Detaching and Syncing ربط وفصل ومزامنة السجلات
- المفهوم الهندسي والتطبيق العملي المباشر لقسم ربط وفصل ومزامنة السجلات في إطار العمل Laravel 12.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 MVC MVC
- Model View Controller
- النمط المعماري الذي يفصل بين نماذج البيانات Models، وطبقات العرض Views، والمتحكمات Controllers في Laravel.
- للمراجعة
- 02 CLI CLI
- Command Line Interface
- واجهة سطر الأوامر التي تعمل عبر أداة php artisan لتوليد الملفات وإدارة التطبيق.
- للمراجعة
- 03 HTTP HTTP
- Hypertext Transfer Protocol
- بروتوكول نقل النص الفائق الذي ينظم طلبات المتصفح واستجابات خادم Laravel.
- للمراجعة
- 04 PSR PSR
- PHP Standards Recommendations
- المعايير القياسية للغة PHP مثل التحميل التلقائي PSR-4 التي يلتزم بها إطار العمل Laravel.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
اكتب ونفّذ المثال البرمجي المشروح في قسم «علاقة متعدد لمتعدد والجدول الوسيط» داخل مشروع Laravel 12 المحلي وتحقق من النتيجة.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم «قراءة أعمدة الجدول الوسيط Pivot» وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ما الهدف الهندسي الأساسي من علاقة متعدد لمتعدد والجدول الوسيط في إطار العمل Laravel 12؟
يسهم علاقة متعدد لمتعدد والجدول الوسيط في تنظيم منطق التطبيق بأسلوب معياري آمن وقابل للصيانة في Laravel 12.
يساعد الالتزام باصطلاحات Laravel 12 الرسمية في قسم «قراءة أعمدة الجدول الوسيط Pivot» على رفع جودة الكود وسهولة اختباره آلياً.
صواب؛ الالتزام بالمعايير القياسية في Laravel 12 يجعل الكود واضحاً وسهل الفحص والصيانة.
أي آلية في Laravel 12 تتولى إدارة ربط وفصل ومزامنة السجلات بشكل مباشر ومنظم؟
توفر طبقة إطار العمل وحاوية الخدمات في Laravel 12 الأدوات القياسية لإدارة ربط وفصل ومزامنة السجلات.
لماذا يُعد تطبيق تصفية النماذج بشرط وجود علاقة مهماً عند بناء تطبيقات Laravel 12 جاهزة للإنتاج؟
لأنه يمنع الأخطاء البرمجية الخفية ويوحد سلوك التطبيق بين بيئتي التطوير والإنتاج.
في Laravel 12، يُنصح بكتابة مفاتيح الإنتاج السرية مباشرة داخل ملفات الكود المصدري المرفوعة إلى Git بدلاً من ملفات البيئة.
خطأ؛ يجب حفظ المفاتيح والبيانات السرية في متغيرات البيئة وعدم رفعها أبداً إلى مستودع Git.
ما المزايا الهندسية التي يحققها تطبيق حساب عدد السجلات المرتبطة في Laravel 12؟ (اختر كل ما ينطبق)
يوفر فصلاً واضحاً للمسؤوليات، وأماناً أعلى أثناء التنفيذ، وتعاوناً أسهل بين أفراد الفريق.
يوظف إطار العمل Laravel 12 ميزات PHP 8 الحديثة مثل تحديد أنواع القيم المرجعة لجعل الكود أكثر وضوحاً وأماناً.
صواب؛ يعتمد Laravel 12 بشكل كامل على الصياغة الحديثة للغة PHP 8.2+ وسلامة الأنواع.
ما الفرق الجوهري بين معيار Laravel 12 الحديث والملفات اليدوية التقليدية في ملخص علاقات الجدول الوسيط؟
يوفر Laravel 12 واجهات قياسية موحدة وحماية مدمجة تغني عن الكود اليدوي المعرض للأخطاء.