لارافيل, Model / 2024-07-18

شرح العلاقة Polymorphic Relation في لارافيل

شرح العلاقة Polymorphic Relation في لارافيل

2024-07-18 وقت القراءه : 4 دقائق

لفرض أن لدينا الجداول التالية

articles
videos
books

ولكل جدول من هذه الجداول يكون لها مجموعة من التعليقات.

 

لتخزين التعليقات في قاعدة البيانات يلجئ البعض لإنشاء جدول للتعليقات لكل نوع مثلا ينشئ الجداول التالية

article_comments
            Id
            comment
            Article_id
            Timestamps
 
video_comments
            Id
            comment
            video_id
            Timestamps
 
book_comments
            Id
            comment
            book_id
            Timestamps

كما نلاحظ أن جميع الحقول متشابهه بإستثناء حقل book_id, video_id, article_id.

 

إلا أن لارافيل وفرت لنا علاقة وهي Polymorphic Relationship حيث يتم إنشاء جدول واحد لجميع الجداول ويتم به تخزين الصور لجميع الحقول الأخرى (articles, videos, users).

 

يكون شكل الجدول على الشكل التالي 

comments
            Id
            Filename
            commentable_id
            commentable_type
            Timestamps


كيفية إنشاء جدول photos

كما نعلم جميعنا يمكن ذلك من خلال إستخدام الأمر

php artisan make:model Comment -m

ويجب أن يحتوي على الحقول التالي

public function up()
{
    Schema::create(comments, function (Blueprint $table) {
        $table->id();
        $table->string('filename');
        $table->morphs('commentable');
        $table->timestamps();
    });
}

كما نلاحظ

  •  يوجد نوع جديد من البيانات وهي morphs، حيث تقوم بإنشاء حقلين وهما commentable_id وكذلك commentable_type  في جدول comments.
  • حقل commentable_type يجب تسميته هكذا اذا كان إسم الجدول comments، أما إذا كان إسم الجدول photos فإنه يجب أن يكون photoable_type وهكذا، بمعنى أنه يجب وضع إسم الجدول singular ومن ثم إضافة able.
  • حقل commentable_id يتم تخزين id الجدول التابع له التعليق.
  • حقل commentable_type يتم تخزين مسار الـ model التابعة له التعليق، كما في الصوره التالية

توضيح

  1. نلاحظ أن التعليق Book 1, Book 2 أنهما يتبعان للموديل Book أي الحقل books وعرفنا ذلك من خلال commentable_type.
  2. نلاحظ أيضا أن commentable_id قد يتكرر، لأن التعليق على id الكتاب رقم 5 ، وكذلك تكرر commentable_id يحمل رقم 5 في التعليق Article 1 وكذلك Project 2  ، إلا إنه كما قلنا يتم التمييز لأي Model تتبع من خلال Commentable_type.

 

الأن بعد أن فهمنا عملية migration وهيكلية الجدول comments نأتي لإنشاء العلاقات.

 

إنشاء العلاقات في Polymorphic relations

في الموديل Comment نضيف الدالة commentable وقد شرحنا بالأعلى لماذا يجب تسميتها بهذا الشكل

public function commentable()
{
    return $this->morphTo();
}

وكما نلاحظ تأخذ نوع العلاقة morphTo.

في الموديل الأخرى وهي Book, Article, Project يجب أن نضيف الدالة comments وبداخلها نحدد العلاقة morphMany ومن ثم تحديد إسم الموديل وفي هذه الحالة هو Comment وكذلك تحديد إسم العلاقة في الموديل Comment وفي هذه الحالة هي commentable

public function comments(): MorphMany
{
    return $this->morphMany(Comments::class, 'commentable');
}

 

كما قلنا يجب أن نضع العلاقة في جميل الموديل (Book, Article, Videos)

 

إضافة التعليقات - إدخال البيانات في علاقة Polymorphic

في إضافة وتخزين التعليقات يجب إستخدام العلاقة 

مثلا إذا كنا نريد إضافة تعليق على كتاب معين

public function addComment($book_id, Request $request)
{
    $book=Book::findOrFail($book_id);
    $book->comments()->create([
        'comment'=>$request->comment
    ]);
}

مع الإنتبها إنه يجب إضافة comment  كـ fileable في comment model

protected $fillable = ['name'];

 

وكذلك إن أردنا إضافة تعليق على Article

public function addComment($article_id, Request $request)
{
    $article=Article::findOrFail($article_id);
    $article->comments()->create([
        'comment'=>$request->comment
    ]);
}

 

 

عرض التعليقات - عرض البيانات في علاقة Polymorphic

لعرض التعليقات لمقال معين، نستخدم with ومن ثم إسم العلاقة وهي comments في حالتنا هذه

$article=Article::with('comments')->where('id',$article->id)->first();




التعليقات
زائر
منذ سنة

كلام زيي الورد

احمد
منذ سنة

مشكور كتير مهندس ايثار على الشرح، استمر والي الأمام. عندي استفسار على هذه النقطة: $article=Article::with(\'comments\')->where(\'id\',$article->id)->first() ماذا لو أردنا البحث في الجدول ال comment المرتبط بال article؟

إضافة تعليق
Loading...