- آموزش laravel
- 1401-11-18
- 849
- 0
what is Lazy loading
به صورت پیش فرض ... دسترسی به داده ها در الکوئنت "Lazy loaded" هست.
$users = User::all();
کوئری که لاراول میسازه به این شکله:
select * from `users`
حالا فرض کن مدل book یه رابطه (Relationship) از نوع belongsTo داره به مدل User ..
foreach ($users as $user) {
echo $user->book->name;// لیزی لود همینه
}
مشکل این لیزی لود اینه که.. به ازای هر یک record که در دیتابیس وجود داره یک کوئری بوجود میاد. مثلا اگر ۴۰ تا record توی جدول داشته باشیم: تعداد کوئری که با همون یک خط بالا بوجود میاد برابر با ۴۰ + ۱ هست.
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
...
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;
}
ثبت دیدگاه جدید
0 دیدگاه
نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *