
كلام مبرمجين
العلاقة متعددة الأشكال أو Polymorphic Relations من الميزات الجميلة في ال eloquent model وال eloquent للي مش عارفه عبارة عن ORM تابع لاطار عمل لارافل ويختص في التعامل مع قواعد البيانات، يعني بتقدر تربط قاعدة البيانات عن طريق ال model وتتعامل معاه ومع العلاقات كا object. ولو رجعنا لل Polymorphic هذه العلاقة تسمح لنا بربط اكثر من جدول مع جدول وبنفس الحقول وتجي على شكل واحد الى متعدد او على شكل متعدد الى متعدد ! لو الموضوع مش واضح خلونا نوضحه بمثال بسيط : لو معانا مثلا جدول لتخزين التعليقات وجدول للمنشورات وجدول للفيديوهات وكلا الجدولين ( المنشورات والفيديو ) يرتبطوا بجدول التعليقات، الحل اننا نخزن البيانات كمفتاح اجنبي عادي في جدول التعليقات ونضيف حقل اخر يقول لنا تبع اي جدول هذا التعليق وهذا مثال للحقول والجداول :
posts المنشورات id - integer مفتاح اساسي title - string عنوان المنشور body - text محتوى المنشور videos الفيديو id - integer مفتاح اساسي title - string عنوان الفيديو url - string رابط الفيديو comments التعليقات id - integer مفتاح اساسي body - text commentable_id - integer مفتاح اجنبي commentable_type - string اسم ومسار الموديل
الان الحقول اللي تهمنا في جدول التعليقات هي : commentable_id و commentable_type وبعد ما ننفذ ال migration نروح الان الى model comment ونضيف هذه الدالة :
public function commentable() { return $this->morphTo(); }
الان وفي اي model ثاني نحب نربطه مع جدول التعليقات سواء كان معانا جدول او عشرة فقط بنضيف له هذه الدالة فقط :
public function comments() { return $this->morphMany('App\Comment', 'commentable'); }
لا ونقدر اننا نكتبها مرة واحدة فقط داخل trait ونستخدمها في كل model عنده تعليقات . باقي الان كيف نستخدمها، لو حبينا نجيب التعليقات لمنشور معين كل اللي بنعمله كما في هذا المثال :
$post = App\Post::find(1); foreach ($post->comments as $comment) { // }
طيب لو نحنا في التعليقات ونشتي نعرف تبع من هذا التعليق بتكون العلاقة بهذا الشكل :
$comment = App\Comment::find(1); $commentable = $comment->commentable;
وبس .. في اسهل من كذا وكود اقصر منه؟ ماعتقدش الان هذه الطريقة ممكن نستخدمه مع الصور او نسجل فيها العمليات اللي في النظام وممكن نعمل محتوى باكثر من لغة ... الخ . المرجع : التوثيق الرسمي لموقع laravel.com.
* - ملاحظة : هذا المنشور كتب في 2018 لذا يمكن أن تكون هناك معلومات حديثة في التوثيق.