Skip to main content

Command Palette

Search for a command to run...

Eloquent Caching: Asosiy bilishingiz kerak bo'lgan narsalar

Updated
2 min read
Eloquent Caching: Asosiy bilishingiz kerak bo'lgan narsalar

Loyihamizda kam o'zgarishlarga uchraydigan yirik hajmdagi ma'lumotlar olishda ma'lumotlar bazasiga yuklamani kamaytirish uchun keshlashdan foydalanishimiz mumkin.

Buning uchun Laravelda Cache class laridan foydalanamiz

Quyida bazadan ma'lumotlarni olishni optimizatsiya qilishda keshlash masalasini ko'rib chiqamiz.

Keshlash asoslari

Ma'lumotlarni keshlash uchun Cache::remember() funksiyasidan foydalanamiz:

app/Http/Controllers/ProductsController.php:

use Illuminate\Support\Facades\Cache; 
// ... 
Cache::remember('KEY', TIME_IN_SECONDS, function () {    
     return Model::get(); //yoki shunga o'xshash Eloquent so'rovi
});

Model massivlarni keshda saqlash

Aytaylik masalan siz ma'lumotlar bazasidan barcha mahsulotlarni Product modelidan olib,uni 60 daqiqaga keshda saqlab qo'ymoqchisiz.

app/Http/Controllers/ProductsController.php:

use Illuminate\Support\Facades\Cache; 
// ... 
public function index(){
    $products = Cache::remember('products_list', 60 * 60, function () {
          return Product::get();    
    });
     return view('products', compact('products'));
}

Buning natijasida biz mahsulotlarni bazadan emas keshdan oladidan qildik.

Murakkabroq so'rovlarni keshda saqlash

Ba'zida keshlash uchun ma'lumot bir attiributlarga bog'liq bo'lishi mumkin, masalan kategoriya bo'yicha keshlash sharti mavjud bo'lishi

Keling yuqoridagi misolda kategoriya bo'yicha filterlangan ma'lumotlarni keshlashga misol:

app/Http/Controllers/ProductsController.php:

use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;  

public function index(Request $request){
   if ($request->has('category')) {
      $products = Cache::remember('products_list_' . $request->input('category'), 60 * 60, function () use ($request) {
      return Product::where('category', $request->input('category'))->get();        
});    
} else {
        $products = Cache::remember('products_list', 60 * 60, function () {                                           return Product::get();
        });
    }
     return view('products', compact('products'));
}

Yuqoridagi kodda ko'rganingizdek keshlashdagi saqlovchi kalit so'z oxiriga kategoriya parametrini qo'shib ketish orqali 'products_list_' . $request->input('category') har bir kategoriyani saqlash mumkin.

Keshlangan ma'lumotlarni o'chirish

Cache::forget() funksiyasini chaqirish orqali keshlangan ma'lumotlarni o'chirish mumkin.

app/Http/Controllers/ProductsController.php:

use Illuminate\Support\Facades\Cache; 

Cache::forget('products_list');

Model ma'lumotlarni yangilanganda avtomatik keshni tozalash

Yodingizda tuting: keshlashdan doim model bilan bog'liq eng yangi ma'lumotlarni saqlab borish lozim shuning uchun model yangilangan vaqtda uning keshda saqlangan versiyasini ham yangilab qo'yish kerak bo'ladi.Buning uchun model yangilangan vaqtda keshni o'chirish yoki buni model observers larida realizatsiya qilib ketish mumkin.

Misol uchun bu quyidagicha ko'rinishi mumkin:

app/Models/Product.php:

use Illuminate\Support\Facades\Cache;
//...

protected static function boot(){    
     parent::boot();
     static::created(function () {
        Cache::forget('products_list');
        });
     static::updated(function () {
        Cache::forget('products_list');
    });
}
B

Raxmat Olloh rozi boʻlsin.

1
N

Rahmat

More from this blog

Rashidov Nuriddin

34 posts