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