TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 611 subscribers
Post #318 183
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت سوم

رابطه 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
.
  • ❤ 1
  • 🔥 1
More from @amirhdeveloper
  1. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  2. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  3. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  4. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  5. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
  6. Sep 19, 2026خیلی وقته پست‌های کانال فقط درمورد LaraGram بوده، وقتشه یکم جالب‌ترش کنیم اگر ممبرها هنوز…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →