المدونة مدونة المهندس محمد خطيب

ما هي Laravel Morph ومتى تستخدم؟ شرح مع مثال بسيط

ma-hy-laravel-morph-omt-tstkhdm-shrh-maa-mthal-bsyt

ما هي Laravel Morph ومتى تستخدم؟ شرح مع مثال بسيط

في إطار Laravel، يعد Eloquent ORM أداة قوية لإدارة العلاقات بين الجداول في قاعدة البيانات. واحدة من العلاقات الأكثر مرونة هي علاقة Morph. في هذه المقالة، سنتعرف على ما هي علاقة Laravel Morph، متى تستخدم، وكيف يمكن تطبيقها من خلال مثال بسيط.

ما هي Laravel Morph؟

علاقة Morph في Laravel هي نوع خاص من العلاقات المتعددة الأشكال (polymorphic relationships) التي تسمح لنموذج واحد (Model) بالارتباط بأكثر من نوع من النماذج (Models) باستخدام جدول قاعدة بيانات واحد. هذا يعني أنه يمكن لنموذج معين أن يكون له ارتباط بنماذج أخرى مختلفة بدون الحاجة إلى جداول متعددة.

متى تستخدم Laravel Morph؟

يتم استخدام علاقة Morph عندما يكون لديك كيان (Entity) يمكن أن يرتبط بنماذج متعددة. على سبيل المثال، يمكن أن يكون لديك نظام تعليقات يمكن استخدامه على منشورات المدونة (Posts)، وكذلك على الفيديوهات (Videos)، في هذه الحالة، يمكنك استخدام علاقة Morph لربط التعليقات (Comments) بكل من المنشورات والفيديوهات باستخدام نفس جدول التعليقات.

مثال بسيط

لنفترض أن لديك جدولين في قاعدة البيانات: posts وvideos، وكلاهما يحتاج إلى تعليقات. بدلاً من إنشاء جدول تعليقات منفصل لكل منهما، يمكنك إنشاء جدول تعليقات واحد يستخدم علاقة Morph.

الخطوة 1: إنشاء النماذج والجداول

أولاً، نقوم بإنشاء النماذج والجداول اللازمة:


php artisan make:model Post -m
php artisan make:model Video -m
php artisan make:model Comment -m

الخطوة 2: إعداد نموذج التعليقات

في نموذج Comment، سنضيف الدوال التالية:


class Comment extends Model{
        public function commentable(){
                return $this->morphTo();
        }
}

الخطوة 3: إعداد النماذج الأخرى

في نموذج Post وVideo، سنضيف الدالة التالية:


class Post extends Model{

		public function comments(){
                return $this->morphMany(Comment::class, 'commentable');
        }
}
		
class Video extends Model{

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

الخطوة 4: إعداد قاعدة البيانات

سنضيف الأعمدة اللازمة في جدول التعليقات:


Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->text('body');
        $table->morphs('commentable');
        $table->timestamps();
});

الخطوة 5: استخدام العلاقة

الآن يمكنك إضافة تعليق إلى منشور أو فيديو ببساطة:


$post = Post::find(1);
$comment = new Comment(['body' => 'Great post!']);
$post->comments()->save($comment);
$video = Video::find(1);
$comment = new Comment(['body' => 'Awesome video!']);
$video->comments()->save($comment);

بهذه الطريقة، يمكنك استخدام نفس جدول التعليقات لربط التعليقات بأكثر من نموذج، مما يقلل من التعقيد في هيكل قاعدة البيانات ويحسن الأداء.

الخلاصة

علاقة Laravel Morph هي أداة قوية ومرنة تتيح لك إدارة العلاقات المعقدة بين النماذج المختلفة بطريقة بسيطة وفعالة. يمكنك استخدامها عندما تحتاج إلى ارتباط نموذج واحد بأنواع متعددة من النماذج باستخدام جدول واحد.