لفرض أن لدينا الجداول التالية
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
كما نعلم جميعنا يمكن ذلك من خلال إستخدام الأمر
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(); }); }
كما نلاحظ
توضيح
الأن بعد أن فهمنا عملية migration وهيكلية الجدول comments نأتي لإنشاء العلاقات.
في الموديل 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)
في إضافة وتخزين التعليقات يجب إستخدام العلاقة
مثلا إذا كنا نريد إضافة تعليق على كتاب معين
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 ]); }
لعرض التعليقات لمقال معين، نستخدم with ومن ثم إسم العلاقة وهي comments في حالتنا هذه
$article=Article::with('comments')->where('id',$article->id)->first();
مشكور كتير مهندس ايثار على الشرح، استمر والي الأمام. عندي استفسار على هذه النقطة: $article=Article::with(\'comments\')->where(\'id\',$article->id)->first() ماذا لو أردنا البحث في الجدول ال comment المرتبط بال article؟
زائر
كلام زيي الورد