انتقل إلى محتوى الدرس
الدرس 40
دورة إطار العمل Laravel

علاقة متعدد لمتعدد والجداول الوسيطة Pivot في EloquentEloquent Many to Many Relationships and Pivot Tables

بناء علاقة متعدد لمتعدد عبر belongsToMany وقراءة أعمدة الجدول الوسيط وإدارة الارتباطات بـ attach و sync واستعلام العلاقات بـ whereHas و withCount.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تربط علاقة متعدد لمتعدد نموذجين معاً عبر جدول ربط وسيط يُعرف بجدول Pivot، مثل ربط المقالات والوسوم عبر جدول post_tag. يعرّف كلا النموذجين العلاقة باستخدام دالة belongsToMany، ويستنتج Eloquent اسم الجدول الوسيط تلقائياً بدمج اسمي النموذجين بصيغة المفرد وفق الترتيب الأبجدي الإنجليزي.

  • التسمية الأبجدية للوسيط (Alphabetical Pivot): ربط نموذجي Post و Tag ينتج اسم الجدول post_tag لأن حرف P يسبق T أبجدياً.
  • تعريف الطرفين (belongsToMany): يستدعي كلا النموذجين دالة belongsToMany للتنقل بين السجلات في الاتجاهين.
  • تخصيص اسم الجدول (Custom Pivot Name): مرر اسم الجدول الوسيط كمعامل ثانٍ للدالة إذا كان يختلف عن الاصطلاح القياسي.
مخطط معماري يوضح علاقة متعدد لمتعدد والجداول الوسيطة Pivot في Eloquent في إطار العمل Laravel 12
PHP
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 في الجدول الوسيط تلقائياً.
PHP
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): مثالية لحفظ مربعات الاختيار في النماذج؛ تضيف المعرفات الجديدة وتحذف غير الموجودة في المصفوفة.
PHP
$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): يستخرج السجلات الأب التي لا تمتلك أي سجلات فرعية أو وسيطة مرتبطة بها.
PHP
$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 الجاهزة
PHP
$post->tags()->sync($request->input('tags', []));

$popular = Post::has('tags')
    ->withCount('tags')
    ->get();
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس حول «علاقة متعدد لمتعدد والجداول الوسيطة Pivot في Eloquent» مفاهيم علاقة متعدد لمتعدد والجدول الوسيط، وقراءة أعمدة الجدول الوسيط Pivot، وربط وفصل ومزامنة السجلات وفق معايير Laravel 12 الحديثة.

الخطوة التالية والدرس القادم

انتقل الآن إلى الدرس التالي «التحميل المسبق وحل مشكلة استعلامات N Plus 1 في Eloquent» للبناء التراكمي على ما تعلمته.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. اكتب ونفّذ المثال البرمجي المشروح في قسم «علاقة متعدد لمتعدد والجدول الوسيط» داخل مشروع Laravel 12 المحلي وتحقق من النتيجة.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم «قراءة أعمدة الجدول الوسيط Pivot» وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ما الهدف الهندسي الأساسي من علاقة متعدد لمتعدد والجدول الوسيط في إطار العمل Laravel 12؟

يسهم علاقة متعدد لمتعدد والجدول الوسيط في تنظيم منطق التطبيق بأسلوب معياري آمن وقابل للصيانة في Laravel 12.

02

يساعد الالتزام باصطلاحات Laravel 12 الرسمية في قسم «قراءة أعمدة الجدول الوسيط Pivot» على رفع جودة الكود وسهولة اختباره آلياً.

صواب؛ الالتزام بالمعايير القياسية في Laravel 12 يجعل الكود واضحاً وسهل الفحص والصيانة.

03

أي آلية في Laravel 12 تتولى إدارة ربط وفصل ومزامنة السجلات بشكل مباشر ومنظم؟

توفر طبقة إطار العمل وحاوية الخدمات في Laravel 12 الأدوات القياسية لإدارة ربط وفصل ومزامنة السجلات.

04

لماذا يُعد تطبيق تصفية النماذج بشرط وجود علاقة مهماً عند بناء تطبيقات Laravel 12 جاهزة للإنتاج؟

لأنه يمنع الأخطاء البرمجية الخفية ويوحد سلوك التطبيق بين بيئتي التطوير والإنتاج.

05

في Laravel 12، يُنصح بكتابة مفاتيح الإنتاج السرية مباشرة داخل ملفات الكود المصدري المرفوعة إلى Git بدلاً من ملفات البيئة.

خطأ؛ يجب حفظ المفاتيح والبيانات السرية في متغيرات البيئة وعدم رفعها أبداً إلى مستودع Git.

06

ما المزايا الهندسية التي يحققها تطبيق حساب عدد السجلات المرتبطة في Laravel 12؟ (اختر كل ما ينطبق)

يوفر فصلاً واضحاً للمسؤوليات، وأماناً أعلى أثناء التنفيذ، وتعاوناً أسهل بين أفراد الفريق.

07

يوظف إطار العمل Laravel 12 ميزات PHP 8 الحديثة مثل تحديد أنواع القيم المرجعة لجعل الكود أكثر وضوحاً وأماناً.

صواب؛ يعتمد Laravel 12 بشكل كامل على الصياغة الحديثة للغة PHP 8.2+ وسلامة الأنواع.

08

ما الفرق الجوهري بين معيار Laravel 12 الحديث والملفات اليدوية التقليدية في ملخص علاقات الجدول الوسيط؟

يوفر Laravel 12 واجهات قياسية موحدة وحماية مدمجة تغني عن الكود اليدوي المعرض للأخطاء.