در روابط چند به چند (Many-to-Many) در Laravel، جداول میانی (pivot tables) برای نگهداری اطلاعات مرتبط بین دو جدول استفاده میشوند.
جداول میانی یا pivot tables چیست؟
جداول میانی (Pivot Tables) برای نگهداری اطلاعات مرتبط با روابط چند به چند (Many-to-Many) استفاده میشوند. این جداول، جداول میانی بین دو جدول اصلی را نشان میدهند و معمولاً فقط شامل کلیدهای خارجی این دو جدول است.
به عنوان مثال فرض کنید میخواهیم نقش کاربران در یک اپلیکیشن رو مدیریت کنیم. یکسری نقش در اپلیکیشن مانند نویسنده، مدیر اصلی، اعضا و غیره... داریم که میتونیم به هر کاربر نقش های مختلفی اختصاص بدیم. در واقع ، "هرکاربر میتونه یک یا چند نقش مختلف داشته باشه و هر نقش متعلق به یک یا چند کاربر باشه" برای ذخیره این اطلاعات، ما به یک جدول میانی برای ذخیره این اطلاعات نیاز داریم که user_id و role_id رو داخلش ذخیره کنیم(البته این جدول میتونه ستون های مختلف دیگه ای هم داشته باشه).
در مورد استاندارد نام گذاری هم باید بگم که ما در لاراول برای نام گذاری نام جداول باید نام جداول رو به صورت جمع (در انتهای نام جدول s جمع استفاده میکنیم).
اسم جداول میانی در واقع ترکیبی از نام تو جدول اصلی هستش. این ترکیب نام باید براساس حروف الفبا نوشته باشه. چون R در الفبا قبل U قرار داره پس اول role رو می نویسم و بعد user رو می نویسم. در پایان هم باید بگم نام این جداول به صورت مفرد (انتهای اسم جدول از حرف s استفاده نمیکنیم) نوشته میشه:
اسم جدول میانی برای کاربران و نقش ها به صورت زیر خواهد بود.
users: جدول کاربران
roles: جدول نقش ها
role_user: جدول میانی
حالا برای اینکه این روابط برقرار کنیم مدل های User و Role رو ایجاد میکنیم. کدش رو در پایین مینویسم:
مدل User:
مدل Role:
با ایجاد این دو مدل در ادامه به توضیح متدهای پرکاربرد در روابط به چند به چند (Many To Many) می پردازیم:
متد attach:
این متد یک رکورد جدید به جدول میانی اضافه میکند. برای مثال، اگر بخواهیم یک کاربر را به یک نقش مرتبط کنیم، میتوانیم از متد attach بر روی رابطه مربوطه استفاده کنیم. مثال:
فرض کنید یک کاربر جدید به یک نقش مرتبط میشود. با استفاده از متد attach، میتوانیم این ارتباط را برقرار کنیم:
متد detach
این متد یک رکورد مرتبط را از جدول میانی حذف کند. به عنوان مثال، اگر بخواهیم ارتباط بین یک کاربر و یک نقش را قطع کنیم، میتوانیم از متد detach بر روی رابطه مربوطه استفاده کنیم.
اگر بخواهیم ارتباط بین یک کاربر و یک نقش را قطع کنیم، از متد detach استفاده میکنیم:
متد sync
این متد بر روی رابطه چند به چند فراخوانی میشود تا رکوردهای مرتبط را با رکوردهای جدید جایگزین کند. به عنوان مثال، اگر بخواهیم نقشهای یک کاربر را با یک مجموعه جدید از نقشها به روز کنیم، میتوانیم از متد sync
بر روی رابطه مربوطه استفاده کنیم.
فرض کنید بخواهیم نقشهای یک کاربر را با مجموعه جدیدی از نقشها به روز کنیم. از متد sync استفاده میکنیم:
این متدها تنها بخشی از متدهایی هستند که در Laravel برای کار با روابط چند به چند در دسترس هستند.