لیزی لودینگ Lazy loading و ایگر لودینگ Eager loading در لاراول

لیزی لودینگ Lazy loading و ایگر لودینگ Eager loading در لاراول

what is Lazy loading

به صورت پیش فرض ... دسترسی به داده ها در الکوئنت "Lazy loaded" هست.

یعنی وقتی از الکوئنت به شکل زیر استفاده میکنی:
$users = User::all();

کوئری که لاراول میسازه به این شکله:

select * from `users`

حالا فرض کن مدل book یه رابطه (Relationship) از نوع belongsTo داره به مدل User ..

  • هر User میتونه چندین book داشته باشه. (hasMany)
  • هر book متعلق به یک User هست. (belongsTo)

foreach ($users as $user) {
    echo $user->book->name;// لیزی لود همینه 
}

مشکل این لیزی لود اینه که.. به ازای هر یک record که در دیتابیس وجود داره یک کوئری بوجود میاد. مثلا اگر ۴۰ تا record توی جدول داشته باشیم: تعداد کوئری که با همون یک خط بالا بوجود میاد برابر با ۴۰ + ۱ هست.

به این داستان مشکل N + 1 هم میگن.
برای همین توصیه میشه به جای اینکار (استفاده از لیزی لودینگ) از Eager-Loading استفاده بشه.

 

what is eager loading

این تکنیک برای حل کردن مشکل N + 1 ساخته شده. فرض کنیم توی مدل کاربر، یک رابطه داریم به اسم book. حالا کد زیر رو در نظر بگیرید:

$users = User::all();

foreach ($users as $user) {
    echo $user->book->name;
}

اگه کوئری خط اول، N کاربر رو برگردونه، خط چهارم باعث به وجود اومدن مشکل N + 1 میشه. یعنی برای لود کردن کتاب‌های هر کاربر، یک کوئری جدا و اختصاصی زده میشه:

select * from books where user_id = 1
select * from books where user_id = 2
select * from books where user_id = 3
select * from books where user_id = 4
...
با Eager Loading می‌تونیم به جای N + 1 کوئری، فقط ۲ تا کوئری داشته باشیم. یک کوئری برای خوندن کاربرها و یک کوئری برای خوندن کتابشون:
 
select * from users
...
select * from books where user_id in (1, 2, 3, 4)

این تکنیک توسط متدهای with و load توی لاراول قابل اجرا هست:

$users = User::all()->load('book');

foreach ($users as $user) {
    echo $user->book->name;
}
 
نویسنده :
مجید پورداود
  • مجید پورداود
  • مهندس نرم افزار و تحلیلگر ارشد سیستم های کامپیوتری تحت وب می باشم. از سال 1395 برنامه نویسی را شروع کردم و به زبان های php (فریم ورک laravel -codeigniter)  و زبان جاوا اسکریپت (فریم ورک express.js-nest.js)  تسلط دارم.  

ثبت دیدگاه جدید

0 دیدگاه

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