
كلام مبرمجين ٢ Many To Many Polymorphic Relations
تحدثنا في منشور سابق عن العلاقة متعددة الاشكال من نوع one to many وتحدثنا عن ربط جداول المنشورات والفيديو مع جدول التعليقات كمثال للعلاقة من هذا النوع . و في هذا المنشور سنوضح علاقة متعدد الى متعدد ، كما نعلم أنه يتوجب علينا في العلاقة المتعدده انشاء جدول وسيط نخزن فيه البيانات المشتركة ( قواعد البيانات العلائقية) . ولنأخذ مثال لعلاقة من هذا عن ميزة موجودة في مواقع التواصل الإجتماعي وهي الوسوم او tags ، ولو اضفناها بحيث يمكننا إستخدام ال tag للإشارة في منشور أو فيديو. في المثال سيكون لدينا الجداول ( المنشور - الفيديو - التاج - جدول وسيط) ولنفرض أن بنيتهم كما يلي :
posts المنشورات
id - integer مفتاح اساسي
title - string عنوان المنشور
body - text محتوى المنشور
videos الفيديو
id - integer مفتاح اساسي
title - string عنوان الفيديو
url - string رابط الفيديو
tags
id - integer مفتاح اساسي
name - string
taggables جدول وسيط
tag_id - integer
taggable_id - integer مفتاح اجنبي
taggable_type - string اسم الموديل والمسار
ما يهمنا الان هو الجدول الوسيط taggables حيث نخزن المفتاح الاجنبي والمرتبط بالجداول وفي مثالنا هما الفيديو والمنشور في حقل taggable_id ولكي نميز لأي جدول يتبع المفتاح سيتم تخزين اسم الموديل في حقل taggable_type والذي يمثل الجدول.
بعد ان انشأنا الجداول، اصبحنا جاهزين لتعريف العلاقة، كل ما علينا القيام به يتمثل بخطوتين : الاولى: الذهاب الى post model و video model واضافة الدالة التالية :
public function tags() { return $this->morphToMany('App\Tag', 'taggable'); }
على اعتبار ان tag model موجود في مجلد app. الخطوة الثانية : تعريف العلاقة العكسية لل post model , video model وذلك باضافة دالتين تشير كل دالة الى model ليصبح ال tag model بعد اضافة الدالتين كما يلي :
namespace App; use Illuminate\Database\Eloquent\Model; class Tag extends Model { /** * Get all of the posts that are assigned this tag. */ public function posts() { return $this->morphedByMany('App\Post', 'taggable'); } /** * Get all of the videos that are assigned this tag. */ public function videos() { return $this->morphedByMany('App\Video', 'taggable'); } }
الان اصبح كل شيء جاهز للاستخدام، ولنفترض اننا نريد الوصول الى كل الtags المرتبطة بمنشور معين كل ما سنقوم به هو استخدام الخاصية tags :
$post = App\Post::find(1); foreach ($post->tags as $tag) { // }
ولو اردنا الوصول الى بيانات الفيديوهات المرتبطة ب tage نستخدم الخاصية videos هكذا :
$tag = App\Tag::find(1); foreach ($tag->videos as $video) { // }
انتهينا .. بإذن الله في المنشور القادم من كلام مبرمجين سنسلط الضوء على طريقة تخزين البيانات المرتبطة وتحديثها. المراجع: التوثيق الرسمي laravel.com