🔥 با کمک هوش مصنوعی در کمتر از 6 ماه فول‌استک شوید ...
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ مهندس هونام اللهیاری
ارتباط چند به چند جداول
استاد ماندیس بحرینی حل شده توسط استاد ماندیس بحرینی

در داکیومنت لاراول برای ارتباط چند به چند جداول از morphToMany استفاده می‌شود.
چگونه باید این مورد رو استفاده کنیم؟ و جدول واسطه باید براش مدل تعریف بشه؟

سلام،

برای ارتباط چند به چند پلی‌مورفیک در لاراول، از morphToMany و morphedByMany استفاده میشه، یک جدول واسطه (مثل taggables) با ستون‌های tag_id, taggable_id, و taggable_type میسازی، توی مدل Tag از morphedByMany برای ارتباط با Post و Video استفاده میکنی و توی Post و Video از morphToMany برای ارتباط با Tag. نیازی به مدل برای جدول واسطه نیست، مگر اینکه ستون اضافی (مثل priority) بخوای با withPivot مدیریت کنی. 

مثال: $post->tags()->attach($tag->id); برای اتصال تگ به پست.
مثال کد:

// Tag.php
public function posts() { return $this->morphedByMany(Post::class, 'taggable')->withPivot('priority'); }
// Post.php
public function tags() { return $this->morphToMany(Tag::class, 'taggable')->withPivot('priority'); }
// استفاده
$post->tags()->attach($tag->id, ['priority' => 1]);
استاد ماندیس بحرینی ۲۴ فروردین ۱۴۰۴، ۲۲:۰۰

چه زمانی از morphToMany و morphedByMany استفاده کنیم بهتر است؟ و اینکه فرقش در عمل با belongsToMany چیه؟

مهندس هونام اللهیاری ۲۵ فروردین ۱۴۰۴، ۱۰:۰۴

از morphToMany و morphedByMany برای ارتباط چند به چند پلی‌مورفیک استفاده میکنیم، یعنی وقتی یه مدل (مثل Tag) بخواد به چند مدل دیگه (مثل Post و Video) وصل بشه. توی مدل اصلی (مثل Post) از morphToMany و توی مدل مرتبط (مثل Tag) از morphedByMany استفاده میشه. جدول واسطه (مثل taggables) باید ستون‌های tag_id, taggable_id, و taggable_type داشته باشه.
اما belongsToMany برای ارتباط چند به چند معمولی بین دو مدل مشخص (مثل User و Role) استفاده میشه و جدول واسطه (مثل role_user) فقط user_id و role_id داره.
فرقشون هم در عمل اینه که belongsToMany ساده‌تره و مستقیم توی دیتابیس با کلیدهای خارجی کار میکنه (مثل on delete cascade)، ولی پلی‌مورفیک انعطاف‌پذیرتره، چون یه مدل رو به چند مدل وصل میکنه، اما پیچیده‌تره و توی دیتابیس مستقیماً رابطه خارجی نداره، پس عملیات خودکار مثل حذف cascade سخت‌تره.

بهترین پاسخ
استاد ماندیس بحرینی ۲۶ فروردین ۱۴۰۴، ۰۵:۵۷