Diyelim ki kodların en altında pagination yaptığınız yerde şöyle yaptınız:
$model = Cache::rememberForever('model', function() use ($model) {
return $model->paginate(1);
});
Güzel. Sonucu önbelleğe aldınız ama sorun var:
Önbellek verisi oluştuktan sonra aramayı kim kullanırsa kullansın (sonuçta oturum değil önbellek, tüm ziyaretçiler ortak kullanacak), hangi seçenekleri seçerse seçsin, hangi sayfaya bakarsa baksın (ki sayfalama zaten çalışmaz) hep ilk yapılan aramanın sonucunu getirecek. Bunun sebebi ne olursa olsun çıktıyı hep aynı önbellek anahtarı ile tutuyorsunuz, yani
model.
Yani böyle olunca da hep ilk aramanın sonucu dönecek demektir.
Bu durumda size özel bir önbellek anahtarı lazım. Bu anahtarı da arama sonuçlarına ve sayfa numarasına göre yapmanız gerekiyor. Bu durumda şöyle yapabilirsiniz:
$model = Car::with(['location', 'rental_value', 'engine_volume', 'year']);
// Bu dizide, kullanılan tüm parametre değerlerini tutacağız.
$parameters = [];
// Önce sayfa numarası ile başlayalım:
// Sayfa değişkenini değiştirmediğinizi varsayıyorum, o yüzden page
if(request('page')) {
$parameters[] = request('page');
}
// Sonra diğer filtre parametreleri
if (post('brand_id')) {
$model = $model->where('brand_id', post('brand_id'));
$parameters[] = post('brand_id');
}
if (post('mdl_id')) {
$model = $model->where('mdl_id', post('mdl_id'));
$parameters[] = post('mdl_id');
}
// ...
// Diğerlerini de bu şekilde yapıyoruz.
// ...
// Son aşamaya geldikten sonra özel keyimizi oluşturuyoruz:
$cacheKey = sha1(implode(',', $parameters));
// ve kullanıyoruz
$model = Cache::rememberForever($cacheKey, function() use ($model) {
return $model->paginate(1);
});
Bu şekilde her arama olasılığı ve sayfa için özel bir key ve ona ait bir önbellek oluşacak. Bir başkası aynı aramayı yaparsa önbellekteki sonuçlar gelecek.
- Car modelinde bir değişiklik olduğunda bu önbelleği temizlemeniz gerekiyor.
- Ayrıca bu yöntem işin içinde böyle sabit parametreler değil de arama kelimeleri de varsa çalışmayacaktır.
- Profesyonel çözüm için ElasticSearch gibi arama motorlarlarından birini kullanmanız gerekiyor.