Laravel-এ Polymorphic Relationship

Laravel হচ্ছে একটি জনপ্রিয় PHP ফ্রেমওয়ার্ক যা MVC আর্কিটেকচারের উপর ভিত্তি করে তৈরি। এর Eloquent ORM (Object-Relational Mapper) ডেভেলপারদের জন্য ডেটাবেসের সাথে কাজ করা অনেক সহজ করে তোলে। Eloquent-এ বিভিন্ন ধরনের রিলেশনশিপ থাকে যেমনঃ one-to-one, one-to-many, many-to-many ইত্যাদি। আজকের এই ব্লগে আমরা আলোচনা করবো Polymorphic Relationship নিয়ে — যা অনেক সময় আমাদের ডেটাবেস ডিজাইনকে সহজ ও ফ্লেক্সিবল করে তোলে।
🔍 Polymorphic Relationship কী?
Polymorphic Relationship এমন একটি রিলেশনশিপ যেখানে একটি মডেল একাধিক অন্যান্য মডেলের সাথে একটি কমন রিলেশন ব্যবহার করে যুক্ত হতে পারে।
উদাহরণ স্বরূপ, ধরুন আপনার একটি Post মডেল এবং একটি Video মডেল রয়েছে। এখন উভয় মডেলের জন্যই আপনি Comment মডেল রাখতে চান। মানে হচ্ছে, Post এবং Video দুইটিতেই Comment থাকবে।
এই অবস্থায় আপনি Comment মডেলকে polymorphic ভাবে ব্যবহার করতে পারেন।
⚙️ উদাহরণ দিয়ে বুঝি (Post, Video এবং Comment)
📌 Step 1: মডেল ও মাইগ্রেশন তৈরি করা
php artisan make:model Post -m
php artisan make:model Video -m
php artisan make:model Comment -m
📌 Step 2: মাইগ্রেশন কোড আপডেট করা
posts টেবিল:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->timestamps();
});
videos টেবিল:
Schema::create('videos', function (Blueprint $table) {
$table->id();
$table->string('url');
$table->timestamps();
});
comments টেবিল:
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->text('body');
$table->morphs('commentable'); // এটিই মূল চাবি!
$table->timestamps();
});
$table->morphs('commentable'); এটি স্বয়ংক্রিয়ভাবে দুটি ফিল্ড তৈরি করবে:
commentable_idcommentable_type
🧠 মডেলগুলোর মধ্যে রিলেশন ডিফাইন করা
📌 Comment.php
class Comment extends Model
{
public function commentable()
{
return $this->morphTo();
}
}
📌 Post.php
class Post extends Model
{
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
📌 Video.php
class Video extends Model
{
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
🧪 কিভাবে ব্যবহার করবেন
একটি পোস্টে কমেন্ট যুক্ত করা:
$post = Post::find(1);
$post->comments()->create([
'body' => 'এটি একটি পোস্টের কমেন্ট।'
]);
একটি ভিডিওতে কমেন্ট যুক্ত করা:
$video = Video::find(1);
$video->comments()->create([
'body' => 'এটি একটি ভিডিওর কমেন্ট।'
]);
📥 কিভাবে কমেন্ট থেকে মূল কনটেন্ট খুঁজে পাবেন
$comment = Comment::find(1);
$content = $comment->commentable; // এটি Post বা Video হতে পারে
✅ উপকারিতা
DRY (Don't Repeat Yourself) প্রিন্সিপল মেনে কোড লেখা যায়।
একাধিক মডেলের জন্য কমন রিলেশন ব্যবহার করা যায়।
প্রোজেক্ট স্কেল করলে কোড আরো বেশি ফ্লেক্সিবল হয়।
❗ সতর্কতা
খুব বেশি polymorphic ব্যবহার করলে কোড জটিল হয়ে যেতে পারে।
বড় প্রোজেক্টে যখন অনেক রিলেশন থাকে, তখন স্পষ্ট ডকুমেন্টেশন রাখা জরুরি।
Laravel-এর Polymorphic Relationship একটি শক্তিশালী ফিচার যা আপনাকে জেনেরিকভাবে বিভিন্ন মডেলের সাথে রিলেশনশিপ তৈরি করতে সাহায্য করে। যখনই আপনি দেখবেন একাধিক মডেল একই ধরনের ডেটা শেয়ার করছে (যেমন: comments, likes, tags), তখন polymorphic approach ব্যবহার করা ভালো।
Laravel শিখতে আগ্রহীদের জন্য এটি অবশ্যই শেখার মতো একটি বিষয়।




