آفلاین
user-avatar

معایب eager loading در لاراول

2 سال پیش
توسط مهدی ابراهیمی آپدیت شد
آفلاین
user-avatar
حسین حسین پور ( 9366 تجربه )
2 سال پیش
تخصص : طراح رابط کاربری، برنامه‌نویس

در مستندات laravel مزایای eager loading به خوبی گفته شده ولی می خواستم بدونم آیا همیشه موقعی که به رابطه جداول نیاز داریم بهتره از این روش استفاده کنیم یا اینکه معایبی هم داره؟

آفلاین
user-avatar
حسین حسین پور ( 9366 تجربه )
2 سال پیش
تخصص : طراح رابط کاربری، برنامه‌نویس

سرچ دادم ، مثل اینکه معایبی نداره :)
طبق مستندات بهتره موقعی که احتیاج به join جداول دارید حتما از eager loading استفاده کنید.

آفلاین
user-avatar
مهدی ابراهیمی ( 2572 تجربه )
2 سال پیش
تخصص : برنامه نویس وب

سلام دوست عزیز این ویژگی دقیقا کارش چیه؟

آفلاین
user-avatar
حسین حسین پور ( 9366 تجربه )
2 سال پیش
تخصص : طراح رابط کاربری، برنامه‌نویس

@azkia

سلام دوست عزیز.
در orm ها ما با یک مشکلی مواجهیم به نام \"N+1 query problem\". که اگر این رو سرچ کنید متوجه قضیه میشید.
ولی خلاصه بخوام بگم فرضا شما یک جدول خودرو (Cars) دارید و یک جدول دیگه مثلا چرخ (wheel) الان هر خودرو میتونه تعداد زیادی چرخ داشته باشه و هر چرخ متعلق به یک حودرو هستش (one-to-many relationship)
بعد فرضا ما کالکشن cars رو میگیریم . و بعدش چند خط پایین تر قراره یک حلقه بزنیم و مشخصات چرخ ها رو هم بگیریم .

$cars = Cars::all();
 foreach ($cars as $car ){
  $wheel_types[] = $car->wheel->type; 
  }

الان این حلقه یک query برای گرفتن کل خودرو ها و N تا query برای گرفتن چرخ ها در دیتابیس اجرا میکنه که این عمل میتونه دیتابیستون رو در تعداد درخواست های بالا فلج کنه و سایتتون بسیار کند میشه. راه حل استفاده از eager loading هستش یعنی موقع گرفتن خودروها بگیم که چرخ ها رو هم با همون query بگیر. که این جوری فقط دو تا query اجرا میشه و کدتون optimize میشه.

$cars = Cars::with('wheels')->all();  

که wheels جدول چرخ ها هستش.
توضیحات کامل تر در مستندات خود لاراول هستش.

آفلاین
user-avatar
مهدی ابراهیمی ( 2572 تجربه )
2 سال پیش
تخصص : برنامه نویس وب

اوه چه جالب. ممنون به خاطر وقتی که گذاشتید و توضیح که دادید. :)

برای ارسال پاسخ باید وارد سایت شوید