سیگنال بلاگ
کاربران فعال
bahramirad bahramirad
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 یا جدول‌های جدا خواناتره.

🎯 جمع‌بندی

تیبل‌های مورف یه ابزار قدرتمندن برای وقتی که چند مدل باید یک رفتار مشترک (مثل کامنت، لایک، تگ) داشته باشن — اما مثل هر ابزار قدرتمندی، باید جای درستش استفاده بشه، نه همه‌جا! 🚀

پایان

گزارش محتوا

اشتراک‌گذاری