TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 611 subscribers
Post #321 217
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت ششم

رابطه Polymorphic Relationships


به شما اجازه می‌دهند که یک مدل به چندین مدل دیگر به‌صورت پویا و با استفاده از یک ساختار واحد مرتبط شود. به عبارت دیگر، در این نوع رابطه، یک مدل می‌تواند به چندین مدل مختلف مرتبط باشد و نیازی به تعریف جداول جداگانه برای هر نوع مدل مرتبط نیست.

این نوع روابط به دو دسته اصلی تقسیم می‌شوند:

1- One-to-One/One-to-Many
2- Many-to-Many

نوع One-to-One/One-to-Many:
در این نوع رابطه، یک مدل می‌تواند به چندین مدل مختلف به صورت یک به یک یا یک به چند مرتبط شود. برای این کار از دو ستون morphable_id و morphable_type در جدول استفاده می‌شود که به ترتیب شناسه مدل و نوع مدل مرتبط را مشخص می‌کنند.

فرض کنید شما می‌خواهید یک سیستم نظر‌دهی ایجاد کنید که کاربران بتوانند به پست‌ها و ویدئوها نظر دهند. به جای ایجاد دو جدول جداگانه برای نظرهای پست‌ها و نظرهای ویدئوها، می‌توانید از یک جدول مشترک comments استفاده کنید و از رابطه Polymorphic بهره ببرید.

1- ساختار جداول:
جدول comments در کنار سایر فیلد ها، دو فیلد commentable_id و commentable_type را دارد.

نکته: شیوه نام گذاری، اسم مفرد جدول با پسوند های able_id و able_type می باشد، مانند commentable_id و commentable_type.

تعریف مدل ها:
ابتدا با متد های مربوطه آشنا می شویم:

1- متد morphTo
این متد برای ارتباط با یک مدل چندشکلی استفاده می‌شود.

پارامتر ها:
1- نام رابطه. اگر این پارامتر مشخص نشود، لاراول به‌صورت خودکار نام رابطه را با توجه به فیلدهای *_id و *_type تشخیص می‌دهد.
2- نام ستون *_type که نوع مدل را نگه می‌دارد. به طور پیش‌فرض لاراول ستون *_type را با توجه به نام رابطه ایجاد می‌کند.
3- نام ستون *_id که شناسه مدل را نگه می‌دارد. به طور پیش‌فرض لاراول ستون *_id را با توجه به نام رابطه ایجاد می‌کند.

2- متد morphOne
این متد برای تعریف رابطه یک به یک چندشکلی استفاده می‌شود. در این رابطه، یک مدل می‌تواند به یک رکورد از مدل‌های مختلف مرتبط باشد.

پارامتر ها:
1- نام کلاس مدلی که رابطه با آن برقرار است.
2- نام رابطه چندشکلی که برای فیلدهای *_id و *_type در مدل فرزند استفاده می‌شود.

3- متد morphMany
این متد مشابه morphOne اما برای تعریف رابطه یک به چند چندشکلی استفاده می‌شود. یعنی یک مدل می‌تواند با چندین رکورد از مدل‌های مختلف مرتبط باشد.

4- متد morphToMany
این متد مشابه morphOne اما برای تعریف رابطه چند به چند چندشکلی استفاده می‌شود. یعنی یک مدل می‌تواند با چندین رکورد از مدل‌های مختلف از طریق یک جدول واسط مرتبط باشد.

5- متد morphedByMany
این متد مشابه morphOne اما برای تعریف رابطه چند به چند چندشکلی از سمت مدل معکوس استفاده می‌شود. یعنی مدلی که در رابطه‌ی چند به چند چندشکلی، سمت دیگر رابطه است.
———
مدل Comment:
در این مدل، از متد morphTo برای ارتباط با مدل‌های دینامیک (پست‌ها و ویدئوها) استفاده می‌شود.
public function commentable()
{
return $this->morphTo();
}


مدل Post و Video
از متد morphMany استفاده می‌شود تا مشخص شود که هر پست می‌تواند چندین نظر داشته باشد. (این متد در هر دو مدل تعریف می شود. بسته به نوع رابطه از متد morphOne نیز استفاده می شود.)
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}


شیوه استفاده مانند روابط قبلی می باشد.
———
نوع Many-to-Many:

یک مدل می‌تواند به چندین مدل مختلف مرتبط شود و برعکس. برای پیاده‌سازی این رابطه، به سه جدول نیاز دارید: یکی برای مدل اصلی، یکی برای مدل‌های مرتبط و یک جدول واسط.

فرض کنید یک سیستم tags دارید که برچسب‌ها می‌توانند به پست‌ها، ویدئوها و حتی به سایر مدل‌ها مرتبط باشند.

ساختار جداول:
جدول اصلی با نام tags یک فیلد id به صورت primary key دارد.
جدول واسط با نام taggables دو فیلد taggable_id و taggable_type طبق قوانین نام گذاری و یک فیلد tag_id به صورت کلید خارجی برای جدول tags می باشد.

تعریف مدل‌ها:


مدل Tag:
در این مدل، از متد morphedByMany برای تعریف ارتباط برچسب با مدل‌های مختلف (پست‌ها، ویدئوها) استفاده می‌شود.
public function posts()
{
return $this->morphedByMany(Post::class, 'taggable');
}

public function videos()
{
return $this->morphedByMany(Video::class, 'taggable');
}


مدل Post و Video:

از متد morphToMany برای ارتباط با برچسب‌ها استفاده می‌شود.
public function tags()
{
return $this->morphToMany(Tag::class, 'taggable');
}


شیوه استفاده نیز مانند روابط Many To Many است.

▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.
  • ❤ 1
  • 🔥 1
More from @amirhdeveloper
  1. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  2. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  3. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  4. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  5. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
  6. Sep 19, 2026خیلی وقته پست‌های کانال فقط درمورد LaraGram بوده، وقتشه یکم جالب‌ترش کنیم اگر ممبرها هنوز…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →