بخش سوم - روابط - قسمت سوم
رابطه Many-to-Many (چند به چند)
رابطه چند به چند (Many-to-Many) یکی از روابط رایج در سیستمهای دیتابیس است که در آن چند رکورد از یک جدول میتواند با چندین رکورد از جدول دیگر مرتبط باشد، و برعکس. برای پیادهسازی این نوع رابطه، از یک جدول واسط (pivot table) استفاده میشود که شناسههای هر دو جدول را نگه میدارد و این ارتباط را برقرار میکند.
مثال:
- یک کاربر میتواند چندین نقش داشته باشد و یک نقش میتواند به چندین کاربر اختصاص داده شود.
- یک دانشجو میتواند در چندین کلاس شرکت کند و یک کلاس میتواند چندین دانشجو داشته باشد.
- یک محصول میتواند در چندین دستهبندی قرار بگیرد و هر دستهبندی میتواند شامل چندین محصول باشد.
1- ساختار جداول:
برای پیادهسازی رابطه چند به چند، شما به سه جدول نیاز دارید:
مثال:
1- جدول اصلی (users): اطلاعات کاربران را نگه میدارد.
2- جدول ثانویه (roles): اطلاعات نقشها را نگه میدارد.
3- جدول واسط (pivot table - role_user): جدول واسط، شناسههای کاربران و نقشها را نگه میدارد و رابطه چند به چند را برقرار میکند.
جداول اصلی و ثانویه، هر کدام دارای یک فیلد id به عنوان primary key هستند.
جدول واسط دارای دو فیلد foreign key برای جداول اصلی و ثانویه هستند. این فیلد ها به صورت پیشفرض باید با نام های جداول اصلی با پسوند _id باشند.
در مثال ما role_id و user_id هستند.
همچنین نام جدول واسط باید ترکیب مفرد جداول اصلی و واسط باشد. در مثال ما role_user می باشد.
2- ایجاد مدلها:
مدل User نشاندهنده جدول users است و رابطه چند به چند با مدل Role دارد. این رابطه با استفاده از متد belongsToMany تعریف میشود.
public function roles()
{
return $this->belongsToMany(Role::class);
}
مدل Role نشاندهنده جدول roles است و رابطه چند به چند با مدل User دارد. این رابطه نیز با استفاده از متد belongsToMany تعریف میشود.
public function users()
{
return $this->belongsToMany(User::class);
}
متد belongsToMany :
برای تعریف رابطه چند به چند استفاده میشود و میتواند چندین پارامتر اختیاری دریافت کند.
1. مدل مربوطه - الزامی
نام مدل مرتبط با این رابطه.
2. جدول واسط - اختیاری
نام جدول واسط (pivot table). اگر این پارامتر تعیین نشود، لاراول بهطور خودکار نام جداول مرتبط را به ترتیب حروف الفبا ترکیب میکند (مثلاً role_user).
3. کلید خارجی مدل فعلی - اختیاری
نام ستون کلید خارجی در جدول واسط که به مدل فعلی اشاره دارد. اگر تعیین نشود، بهطور پیشفرض نام مدل به همراه _id استفاده میشود.
4. کلید خارجی مدل مربوطه - اختیاری
نام ستون کلید خارجی در جدول واسط که به مدل مرتبط اشاره دارد. اگر تعیین نشود، بهطور پیشفرض نام مدل مربوطه به همراه _id استفاده میشود.
5. کلید والد در مدل فعلی - اختیاری
ستون کلید منحصر به فرد در مدل فعلی. بهطور پیشفرض، لاراول از ستون id استفاده میکند.
6. کلید والد در مدل مرتبط - اختیاری
ستون کلید منحصر به فرد در مدل مربوطه. بهطور پیشفرض، لاراول از ستون id استفاده میکند.
3- استفاده از رابطه:
برای بازیابی تمامی نقشهای یک کاربر، از پراپرتی roles که با استفاده از belongsToMany تعریف شده، استفاده میکنیم.
$user = User::find(1);
$roles = $user->roles;
برای بازیابی تمامی کاربران مرتبط با یک نقش، از پراپرتی users که در مدل Role تعریف شده، استفاده میکنیم.
$role = Role::find(1);
$users = $role->users;
در قسمت بعد متد های مربوط به اعمال تغییرات روی روابط چند به چند توضیح داده می شود.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.