وقتی صحبت از پروژه ها میشه به صورت اتوماتیک بعد از تکنولوژی که برای نوشتن اون پروژه استفاده میشه میریم سراغ دیتابیس و میشه گفت مهم ترین بخش هر پروژه دیتابیسی هست که داره.
به احتمال خیلی زیاد شما هم با رابطه ها توی پروژه های لاراولی کار کردید و میدونید چطوری باید بین دو جدول رابطه برقرار کنید، بعد از نوشتن متد فقط کافیه از 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) <tr> <td>{{$post->id}}</td> <td>{{$post->title}}</td> <td>{{$post->user->name}}</td> </tr> @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
به همین سادگی میشه ازش جلوگیری کرد و سرعت سایت رو بالا برد.
امیدوارم از این آموزش خوشتون امده باشه.
چون مینویسم هستم.