NIAZ
1 ماه پیش
🧬 تیبلهای مورف (Polymorphic) چی هستن؟
وقتی میخوای یک مدل رو به چند مدل مختلف وصل کنی، بدون اینکه برای هر کدوم یک جدول جدا بسازی، سراغ رابطهی مورف (Polymorphic Relation) میری.
مثال کلاسیک: یک جدول comments که هم میتونه به posts تعلق داشته باشه، هم به videos.
🤔 چرا بهجاش دو تا فارینکی نمیذاریم؟
راه سنتی اینه که دو ستون جدا بذاری:
post_id
video_id
اما این روش با اضافهشدن هر مدل جدید، جدولت رو کثیفتر میکنه و همیشه یکی از ستونها NULL میمونه. 🙃
✅ راهحل: دو ستون جادویی
در تیبل مورف، بهجای چند فارینکی، فقط دو ستون داری:
| ستون | کاربرد |
|---|---|
commentable_id |
آیدی رکورد مرتبط |
commentable_type |
نوع مدل (مثلاً Post یا Video) |
// در Laravel Eloquent
public function commentable()
{
return $this->morphTo();
}
با این ترفند، یک جدول comments میتونه به بینهایت نوع مدل وصل بشه، بدون اینکه ساختارش عوض بشه.
⚖️ نکات مهم قبل از استفاده
- ✳️ ایندکس گذاشتن روی
(*_id, *_type)رو فراموش نکن، وگرنه کوئریها کند میشن. - ✳️ برای رابطههای دوطرفه (مثل تگها بین چند مدل) از
morphToManyاستفاده کن. - ✳️ اگه رابطهی مورف زیاد پیچیده شد، شاید بهتره ساختارت رو دوباره بازبینی کنی؛ گاهی EAV یا جدولهای جدا خواناتره.
🎯 جمعبندی
تیبلهای مورف یه ابزار قدرتمندن برای وقتی که چند مدل باید یک رفتار مشترک (مثل کامنت، لایک، تگ) داشته باشن — اما مثل هر ابزار قدرتمندی، باید جای درستش استفاده بشه، نه همهجا! 🚀