# 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: মডেল ও মাইগ্রেশন তৈরি করা

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

### 📌 Step 2: মাইগ্রেশন কোড আপডেট করা

**posts টেবিল:**

```plaintext
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->timestamps();
});
```

**videos টেবিল:**

```plaintext
Schema::create('videos', function (Blueprint $table) {
    $table->id();
    $table->string('url');
    $table->timestamps();
});
```

**comments টেবিল:**

```plaintext
Schema::create('comments', function (Blueprint $table) {
    $table->id();
    $table->text('body');
    $table->morphs('commentable'); // এটিই মূল চাবি!
    $table->timestamps();
});
```

`$table->morphs('commentable');` এটি স্বয়ংক্রিয়ভাবে দুটি ফিল্ড তৈরি করবে:

* `commentable_id`
    
* `commentable_type`
    

---

## 🧠 মডেলগুলোর মধ্যে রিলেশন ডিফাইন করা

### 📌 Comment.php

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

### 📌 Post.php

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

### 📌 Video.php

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

---

## 🧪 কিভাবে ব্যবহার করবেন

### একটি পোস্টে কমেন্ট যুক্ত করা:

```plaintext
$post = Post::find(1);
$post->comments()->create([
    'body' => 'এটি একটি পোস্টের কমেন্ট।'
]);
```

### একটি ভিডিওতে কমেন্ট যুক্ত করা:

```plaintext
$video = Video::find(1);
$video->comments()->create([
    'body' => 'এটি একটি ভিডিওর কমেন্ট।'
]);
```

---

## 📥 কিভাবে কমেন্ট থেকে মূল কনটেন্ট খুঁজে পাবেন

```plaintext
$comment = Comment::find(1);
$content = $comment->commentable; // এটি Post বা Video হতে পারে
```

---

## ✅ উপকারিতা

* DRY (Don't Repeat Yourself) প্রিন্সিপল মেনে কোড লেখা যায়।
    
* একাধিক মডেলের জন্য কমন রিলেশন ব্যবহার করা যায়।
    
* প্রোজেক্ট স্কেল করলে কোড আরো বেশি ফ্লেক্সিবল হয়।
    

---

## ❗ সতর্কতা

* খুব বেশি polymorphic ব্যবহার করলে কোড জটিল হয়ে যেতে পারে।
    
* বড় প্রোজেক্টে যখন অনেক রিলেশন থাকে, তখন স্পষ্ট ডকুমেন্টেশন রাখা জরুরি।
    

---

Laravel-এর Polymorphic Relationship একটি শক্তিশালী ফিচার যা আপনাকে জেনেরিকভাবে বিভিন্ন মডেলের সাথে রিলেশনশিপ তৈরি করতে সাহায্য করে। যখনই আপনি দেখবেন একাধিক মডেল একই ধরনের ডেটা শেয়ার করছে (যেমন: comments, likes, tags), তখন polymorphic approach ব্যবহার করা ভালো।

Laravel শিখতে আগ্রহীদের জন্য এটি অবশ্যই শেখার মতো একটি বিষয়।
