آموزش ارتباط hasMany در لاراول
مدلهای تعریف شده در لاراول میتوانند با شیوههای مختلف به یکدیگر ارتباط داشته باشند. یکی از پرکاربردترین ارتباطهای قابل استفاده، ارتباط hasMany است.
این ارتباط مشخص میکند که یک مدل دارای یک یا چندین نمونه از یک مدل دیگر است برای مثال:
- یک استان دارای چندین شهر است
- یک کلاس دارای چندین دانش آموز است
- یک مدرسه دارای چندین کلاس است
- یک پروژه دارای چندین فعالیت است
برای تعریف یک ارتباط از نوع hasMany به شکل زیر عمل میکنیم. برای مثال ایجاد ارتباط میان استان و شهرهای استان:
1 2 3 |
public function Cities() { return $this->hasMany( 'App\City', 'province_id' ); } |
این قطعه کد در مدل Province.php درج میشود به شکل زیر قابل استفاده است:
1 |
$tehran_cities = Provice::where( 'name', 'تهران' )->first()->Cities; |
همچنین میتوان روی کوئری ایجاد شده برای شهرها شرط قرار داد:
1 2 |
$tehran_big_cities = Provice::where( 'name', 'تهران' )->first() ->Cities()->where( 'population', '>', 100000 )->get(); |
برای بارگزاری حریصانهی مدلهای فرزند هم به شکل زیر عمل میکنیم تا تعداد کوئریهای ایجاد شده روی پایگاه داده به حداقل برسد:
1 |
$all_provinces_and_cities = Province::with( 'Cities' )->get(); |
دستور بالا برای تمامی استانها و شهرها تنها از دو کوئری استفاده میکند و شهرهای هر استان را به صورت خودکار در همان استان بارگزاری میکند. در هنگام طراحی سایت با لاراول، بارگزاری حریصانه یا Eager Loading در هنگام استفاده از hasMany ضروری و پر اهمیت است زیرا در غیر این صورت به ازای هر ردیف از مدل اول یک کوئری روی جدول دوم اجرا میشود که میتواند سرعت و عملکرد سایت را به مقدار زیادی کاهش دهد.
همچنین لازم است تا روی ستون کلیدی جدول دوم( در اینجا province_id ) index گذاری کنید تا جستجو و ایجاد ارتباط با بیشترین سرعت ممکن عملی باشد.