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

علاقتا واحد لواحد وواحد لمتعدد في نماذج EloquentEloquent One to One and One to Many Relationships

تمثيل علاقتي واحد لواحد وواحد لمتعدد بين نماذج Eloquent باستخدام دوال hasOne و hasMany والعلاقة العكسية belongsTo.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تربط علاقة واحد لواحد نموذجاً أباً بسجل واحد على الأكثر في جدول آخر، مثل امتلاك كل مستخدم لملف شخصي وحيد. يوجه استدعاء دالة hasOne داخل النموذج الأب إطار Eloquent لمطابقة المفتاح الأساسي للأب مع المفتاح الأجنبي القياسي user_id في الجدول التابع.

  • تعريف الدالة (hasOne Method): تُعرّف داخل كلاس النموذج الأب الذي لا يحتوي جدوله على عمود المفتاح الأجنبي.
  • اصطلاح المفتاح الأجنبي (Foreign Key Convention): يفترض تلقائياً اسم النموذج الأب بصيغة snake_case متبوعاً باللاحقة _id.
  • تخصيص المفاتيح (Custom Keys): يتيح المعاملان الثاني والثالث تحديد اسم المفتاح الأجنبي والمفتاح المحلي يدوياً عند اختلافهما.
مخطط معماري يوضح علاقتا واحد لواحد وواحد لمتعدد في نماذج Eloquent في إطار العمل Laravel 12
PHP
use Illuminate\Database\Eloquent\Relations\HasOne;

public function profile(): HasOne
{
    return $this->hasOne(Profile::class);
}

$bio = $user->profile->bio;

للانتقال من النموذج التابع الذي يحمل المفتاح الأجنبي صعوداً إلى النموذج الأب المالك له، نعرف علاقة عكسية باستخدام دالة belongsTo. يضمن إلحاق دالة withDefault بالعلاقة العكسية إرجاع كائن نموذج افتراضي بديل عندما يكون المفتاح الأجنبي فارغاً، مما يمنع أخطاء القيم الفارغة في الواجهات.

  • موقع العلاقة العكسية (belongsTo Location): تُوضع دائماً في كلاس النموذج الذي يحتوي جدوله فعلياً على عمود المفتاح الأجنبي.
  • استنتاج المفتاح من الدالة (Key Inference): يفحص Eloquent اسم دالة العلاقة ويضيف إليه _id لتحديد عمود المفتاح الأجنبي.
  • الكائن البديل الآمن (withDefault): يعيد كائن نموذج بديلاً بقيم افتراضية عند غياب الأب لمنع توقف العرض.
PHP
use Illuminate\Database\Eloquent\Relations\BelongsTo;

public function user(): BelongsTo
{
    return $this->belongsTo(User::class)
        ->withDefault(['name' => 'Guest Author']);
}

تمثل علاقة واحد لمتعدد سجلاً أباً يمتلك عدداً غير محدود من السجلات التابعة، مثل قسم يضم عشرات المنتجات أو مقال يحتوي على عدة تعليقات. يعيد استدعاء دالة hasMany في النموذج الأب مجموعة Eloquent Collection تضم كافة السجلات الأبناء المرتبطة عند قراءتها كخاصية ديناميكية.

  • التسمية بصيغة الجمع (Plural Method Name): يُسمى تابع العلاقة بصيغة الجمع مثل posts أو comments ليعكس إرجاع مجموعة سجلات.
  • إرجاع مجموعة كائنات (Collection Result): قراءة الخاصية الديناميكية تعيد كائن Eloquent Collection قابلاً للدوران والتصفية.
  • الاقتران العكسي (Inverse Pairing): يعرف النموذج الابن دالة مفردة بصيغة belongsTo تشير عكسياً إلى النموذج الأب.
PHP
use Illuminate\Database\Eloquent\Relations\HasMany;

public function comments(): HasMany
{
    return $this->hasMany(Comment::class);
}

$count = $post->comments->count();

يوفر Eloquent طريقتين مختلفتين للتعامل مع العلاقة: قراءتها كخاصية تحمل كامل السجلات المرتبطة في الذاكرة، بينما استدعاؤها كدالة يعيد باني استعلام العلاقة. يتيح ربط الشروط بدالة العلاقة تنفيذ التصفية والترتيب مباشرة داخل قاعدة البيانات دون تحميل صفوف غير مطلوبة.

  • الوصول كخاصية ديناميكية (Property Access): كتابة $user->posts بدون أقواس تنفذ استعلام الجلب فوراً وتعيد المجموعة كاملة.
  • الاستدعاء كدالة استعلام (Method Call): كتابة $user->posts بالأقواس تعيد كائن باني الاستعلام لإضافة شروط مخصصة.
  • التصفية في القاعدة (SQL Filtering): ربط دوال where أو latest بدالة العلاقة يقلل استهلاك ذاكرة الخادم بشكل كبير.
PHP
$allPosts = $user->posts;

$published = $user->posts()
    ->where('is_published', true)
    ->latest()
    ->get();

تشكل علاقات الواحد لواحد والواحد لمتعدد العمود الفقري لهيكلة البيانات العلائقية في تطبيقات Laravel. يضمن إتقان تحديد موقع المفتاح الأجنبي وتعريف العلاقة العكسية belongsTo واستخدام باني استعلام العلاقة تنقلاً وحفظاً للبيانات بأعلى درجات النظافة والموثوقية.

وجه المقارنة الهندسيالأسلوب اليدوي أو غير المحسنمعيار Laravel 12 الحديث
جلب السجلات التابعةكتابة شرط المفتاح الأجنبي يدوياً في كل استعلام بالمتحكمتعريف علاقة hasMany في النموذج واستدعائها مباشرة
حساب عدد الأبناءتحميل كافة الكائنات في الذاكرة ثم عدها عبر المجموعةاستدعاء count على دالة العلاقة لتنفيذ عد مباشر في القاعدة
المفاتيح الأجنبية الاختياريةتكرار فحوصات القيمة الفارغة في كل قالب عرض لتجنب الأخطاءإلحاق دالة withDefault بتعريف علاقة belongsTo العكسية
حفظ السجلات الأبناءدمج رقم معرف الأب يدوياً داخل مصفوفة البيانات قبل الحفظاستدعاء دالة create مباشرة عبر علاقة النموذج الأب
PHP
$authorName = $post->user->name;

$recentCount = $user->posts()
    ->where('created_at', '>=', now()->subWeek())
    ->count();
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

أتقنت في هذا الدرس حول «علاقتا واحد لواحد وواحد لمتعدد في نماذج Eloquent» مفاهيم علاقة واحد لواحد بدالة HasOne، والعلاقة العكسية بدالة BelongsTo، وعلاقة واحد لمتعدد بدالة HasMany وفق معايير Laravel 12 الحديثة.

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

انتقل الآن إلى الدرس التالي «علاقة متعدد لمتعدد والجداول الوسيطة Pivot في Eloquent» للبناء التراكمي على ما تعلمته.

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 HasMany Relations علاقة لمتعدد
تمثيل علاقتي واحد لواحد وواحد لمتعدد بين نماذج Eloquent باستخدام دوال hasOne و hasMany والعلاقة العكسية belongsTo.
للمراجعة
02 One to One With HasOne علاقة واحد لواحد بدالة HasOne
المفهوم الهندسي والتطبيق العملي المباشر لقسم علاقة واحد لواحد بدالة HasOne في إطار العمل Laravel 12.
للمراجعة
03 Inverse Relations With BelongsTo العلاقة العكسية بدالة BelongsTo
المفهوم الهندسي والتطبيق العملي المباشر لقسم العلاقة العكسية بدالة BelongsTo في إطار العمل Laravel 12.
للمراجعة
04 One to Many With HasMany علاقة واحد لمتعدد بدالة HasMany
المفهوم الهندسي والتطبيق العملي المباشر لقسم علاقة واحد لمتعدد بدالة HasMany في إطار العمل 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. اكتب ونفّذ المثال البرمجي المشروح في قسم «علاقة واحد لواحد بدالة HasOne» داخل مشروع Laravel 12 المحلي وتحقق من النتيجة.

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

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

مساحة التحدي

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

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

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

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

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

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

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

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

02

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

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

03

أي آلية في Laravel 12 تتولى إدارة علاقة واحد لمتعدد بدالة HasMany بشكل مباشر ومنظم؟

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

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 واجهات قياسية موحدة وحماية مدمجة تغني عن الكود اليدوي المعرض للأخطاء.