درخواست کمتر، سرعت بیشتر!

به احتمال خیلی زیاد شما هم با رابطه ها توی پروژه های لاراولی کار کردید و می‌دونید چطوری باید بین دو جدول رابطه برقرار کنید، بعد از نوشتن متد فقط کافیه از *with* یا *load* استفاده کنید که وقتی داره از دیتابیس اطلاعات رو فراخوانی می‌کنه به همراه رابطه‌هاشون باشه

“`
// model Post
public function user(){
return $this->belongsTo(User::class);
}

// Controller

$posts=Post::with(‘user’)->get();

// Sql
// حالا دقیقا نمی‌دونم از چه نوع join استفاده می‌کنه ولی کد یچزی میشه مثل این

select * from posts
inner join users on users.id=posts.user_id;

“`

نباید چیزی فراتر از این باشه 😅

خب تا اینجا همه چی داره خوب پیش میره!
ولی مشکل از کجا شروع میشه؟

فرض کنید که با چند برنامه‌نویس دیگه دارید پرژه رو جلو می‌برید و بعضی از افراد به اندازه کافی تجربه ندارند یا زمانی که خسته هستید دارید کدی رو می‌زنید و یادتون میره از *with* استفاده کنید.

> **load** زیاد قابل استفاده نیست وقتی دارید از دیتابیس اطلاعات می‌گیرید بیشتر برای زمانی هست که دیتا لود شده ولی شما به چندتا رابطه هم نیاز دارید مثل زمانی که *route binding* انجام میدید.

خب بریم ببینیم دقیقا چی میشه!

“`
// model Post
public function user(){
return $this->belongsTo(User::class);
}

// Controller

$posts=Post::all();

// فرق نداره توی blade یا resource ها باشه ولی روی blade مثال میزنم راحت تره!

// Blade

@foreach($posts as $post)

{{$post->id}} {{$post->title}} {{$post->user->name}}

@endforeach
“`

خب مشکل کد بالا چی هست؟

درخواستی که به دیتابیس زده میشه میشه

“`
select * from posts
“`

و زمانی که توی حلقه هستید باز هم به دیتابیس درخواست هایی ارسال میشه به این صورت

“`
select * from user where id = $post->user_id
“`

و اگر ۱۰ تا ردیف واکشی شده باشه برای **post** شما برای گرفتن دیتا ۱۰+۱ درخواست به دیتابیس میزنید

“`
// 1x
select * from posts;

// 10x
select * from user where id = $post->user_id
“`

خب چطوری میشه کاری کرد که جلوی این اتفاق رو بگیریم؟

به این حالت می‌گن **lazy load** کردن دیتا، مدل های لاراول این قابلیت رو دارند که متوجه بشند شما دیتا رو لود کردید یا دارید lazy load انجام میدید! خب چطوری میشه جلوش رو گرفت؟

فقط کافیه یجایی از پروژه‌اتون از کد زیر استفاده کنید.

“`
Model::preventLazyLoading();
“`

> بهتره که بالاترین جای پروژه باشه مثلا *AppServiceProvider.php*

به همین سادگی میشه ازش جلوگیری کرد و سرعت سایت رو بالا برد.

امیدوارم از این آموزش خوشتون امده باشه.

چون می‌نویسم هستم.

پاسخی بگذارید

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