آموزش ارتباط hasMany در لاراول

مدل‌های تعریف شده در لاراول می‌توانند با شیوه‌های مختلف به یکدیگر ارتباط داشته باشند. یکی از پرکاربردترین ارتباط‌های قابل استفاده، ارتباط hasMany است.
لاراول>
این ارتباط مشخص می‌کند که یک مدل دارای یک یا چندین نمونه از یک مدل دیگر است برای مثال:

  • یک استان دارای چندین شهر است
  • یک کلاس دارای چندین دانش آموز است
  • یک مدرسه دارای چندین کلاس است
  • یک پروژه دارای چندین فعالیت است

برای تعریف یک ارتباط از نوع hasMany به شکل زیر عمل می‌کنیم. برای مثال ایجاد ارتباط میان استان و شهرهای استان:

این قطعه کد در مدل Province.php درج می‌شود به شکل زیر قابل استفاده است:

همچنین می‌توان روی کوئری ایجاد شده برای شهرها شرط قرار داد:

برای بارگزاری حریصانه‌ی مدل‌های فرزند هم به شکل زیر عمل می‌کنیم تا تعداد کوئری‌های ایجاد شده روی پایگاه داده به حداقل برسد:

دستور بالا برای تمامی استان‌ها و شهرها تنها از دو کوئری استفاده می‌کند و شهرهای هر استان را به صورت خودکار در همان استان بارگزاری می‌کند. در هنگام طراحی سایت با لاراول، بارگزاری حریصانه یا Eager Loading در هنگام استفاده از hasMany ضروری و پر اهمیت است زیرا در غیر این صورت به ازای هر ردیف از مدل اول یک کوئری روی جدول دوم اجرا می‌شود که می‌تواند سرعت و عملکرد سایت را به مقدار زیادی کاهش دهد.

همچنین لازم است تا روی ستون کلیدی جدول دوم( در اینجا province_id ) index گذاری کنید تا جستجو و ایجاد ارتباط با بیشترین سرعت ممکن عملی باشد.

تفاوت hasMany و belongsToMany در لاراول

تفاوت مهم بین روابط hasMany و belongsToMany در لاراول، نوع و ساختار پایگاه داده آنهاست:

  • hasMany یک رابطه یک به چند است که در آن یک مدل چندین رکورد در مدل دیگر دارد. کلید خارجی در جدول مدل وابسته قرار دارد. مثال: یک کاربر تعداد زیادی پست دارد؛ جدول پست‌ها user_id دارد.
  • belongsToMany یک رابطه چند به چند است که در آن هر دو مدل می‌توانند تعداد زیادی از کلیدهای خارجی مدل دیگر را داشته باشند. برای ذخیره روابط، که معمولاً شامل کلیدهای خارجی هر دو مدل مرتبط است، به یک جدول محوری نیاز دارد. مثال: یک کاربر به چندین نقش تعلق دارد و یک نقش به چندین کاربر تعلق دارد که از طریق یک جدول محوری مانند role_user به هم مرتبط هستند.

به طور خلاصه، وقتی یک مدل به طور مستقیم مالک چندین رکورد مرتبط است، از hasMany استفاده کنید و وقتی چندین رکورد در هر دو طرف از طریق یک جدول محوری به هم مرتبط هستند، از belongsToMany استفاده کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *