🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علی منظور
ارتباط چند به چند جداول
محسن موحد حل شده توسط محسن موحد

در داکیومنت لاراول برای ارتباط چند به چند جداول از 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 سخت‌تره.

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