# 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**](https://laravel.com/docs/10.x/cache#retrieve-store) 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**:

```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**:

```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.

![](https://laraveldaily.com/uploads/2023/02/eloquentCached.png align="left")

## **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**:

```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**:

```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**](https://laraveldaily.com/lesson/eloquent-the-expert-level/model-observers) larida realizatsiya qilib ketish mumkin.

Misol uchun bu quyidagicha ko'rinishi mumkin:

**app/Models/Product.php**:

```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');
    });
}
```
