Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 09.08.2018 23:24:11

nemerki
Üye
Kayıtlı: 23.06.2018
Mesajlar: 28

ajax pagination

Merhaba Arkadaşlar ben bir filtreleme sonucunu  ajax ile pagination yapmak istiyorum fakat  veritabanından çektiğim veriyi tekrar tekrar çekmek istemiyorum bunu nasıl cache alıb ordan çekebilirim yada başka bildiğiniz bir yolu varmı.Aşağıda filtre yaptığım view resmi ve filtr işlemleri yaptığım kod var koddan da görüleceği üzere relationlarla falan databasden baya bir veri çekiliyor her sayfa için bu verileri tekrar tekrar çekmekmantıklı değil 

   Cache::add('model', $model, $minute); 

bu şekilde cache yapmaya çalıştım komple modeli ama olmadı nerde yanlış yapmışım  ?


    public function onSearch()
    {
        $model = Car::with(['location', 'rental_value', 'engine_volume', 'year']);

        if (post('brand_id')) {
            $model = $model->where('brand_id', post('brand_id'));
        }
        if (post('mdl_id')) {
            $model = $model->where('mdl_id', post('mdl_id'));
        }
        if (post('mdl_id')) {
            $model = $model->where('mdl_id', post('mdl_id'));
        }

        if (post('fuel_id')) {
            $model = $model->where('fuel_id', post('fuel_id'));
        }
        if (post('ban_id')) {
            $model = $model->where('ban_id', post('ban_id'));
        }
        if (post('color_id')) {
            $model = $model->where('color_id', post('color_id'));
        }
        if (post('seat_id')) {
            $model = $model->where('seat_id', post('seat_id'));
        }
        if (post('transmision_id')) {
            $model = $model->where('transmision_id', post('transmision_id'));
        }
        if (post('wheel_id')) {
            $model = $model->where('wheel_id', post('wheel_id'));
        }
        if (post('city_id')) {
            $city_id = post('city_id');
            $model = $model->whereHas('location', function ($q) use ($city_id) {
                $q->where('city_id', $city_id);
            });


        }

        $year_min = post('year_min');
        $year_max = post('year_max');
        $model = $model->whereHas('year', function ($q) use ($year_min, $year_max) {
            $q->where('year', '>=', $year_min)->where('year', '<=', $year_max);
        });


        $engine_volume_min = post('engine_volume_min');
        $engine_volume_max = post('engine_volume_max');
        $model = $model->whereHas('engine_volume', function ($q) use ($engine_volume_min, $engine_volume_max) {
            $q->where('volume', '>=', $engine_volume_min)->where('volume', '<=', $engine_volume_max);
        });


        $price_min = post('price_min');
        $price_max = post('price_max');
        $model = $model->whereHas('rental_value', function ($q) use ($price_min, $price_max) {
            $q->where('one_day', '>=', $price_min)->where('one_day', '<=', $price_max);
        });



        $model = $model->paginate(1);
        $this->page['partialsRecords'] = $model;
        $this->page['filterResultPagination'] = $model;
        $this->page['filterClass'] = 'filterAjaxPagination';


    }

4z9Wr7.png

Çevrimdışı

#2 10.08.2018 00:08:06

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,360
Website

Yanıt: ajax pagination

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.

Çevrimdışı

#3 10.08.2018 08:10:02

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 349

Yanıt: ajax pagination

en baştaki where yapısı cok uzun; complexity i artırıyor. bu kadar uzun bir where yapısını aynı kuralda tekrar etmişsiniz.. bu geliştirici için negatif bir etken olmalı..

şöyle yapmalısınız..

$ids=['model_id,'brand_id',........];

foreach ($request->all() as $key=>$value){

if(in_array($key,$ids){
$model = $model->where($key, $value));

}

}

bu şekliyle kodunuz daha kısalmış olur.


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#4 10.08.2018 08:29:30

nemerki
Üye
Kayıtlı: 23.06.2018
Mesajlar: 28

Yanıt: ajax pagination

Cevap için teşekkür ederim ama benim yapmak istediğim bu değil  benim Car modeli sürekli güncelleniyor yani cachi serverda tutamam burda yapmak istediğim cach i kullanıcının bilgisayarında tutmak yani kullanıcı arama yaptı diyelim ki 100 tane veri döndü paginate(10) dediğim için her sayfada 10 veriyi gösterdi şimdi bu kullanıcı diğer kalan 90 veriyi görmek için 2 sayfaya geçmek istediğinde ben tüm form elemanlarını tekrar post edip paginate (10,2) yazıyorum gidip tekrar verileri çekiyor ve ikinci 10 elemanı getiriyor şimdi ben istiyorum ki adam filtireleme  yapınca geri dönen sonucu adamın kendi cachinde tutayım ordan çekip göstereyim ikinci sayfadaki verileri görmek için veritabanına bağlanmasın  filtirelemeyi değiştirirse  o cachi tekrar oluşturuyorum zaten

Cacheden veriyi sadece 2 sayfaya geçmek için tıkladığında çağırıyorum normal filtire yaptığı zaman veritabanından çekiyorum

Çevrimdışı

#5 10.08.2018 09:24:19

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,360
Website

Yanıt: ajax pagination

Öyleyse siz sonucu sadece önbellekte değil oturum değişkeni olarak tutacaksınız.

$model = session($cacheKey) ?: $model->paginate(1);

Çevrimdışı

#6 10.08.2018 12:19:52

nemerki
Üye
Kayıtlı: 23.06.2018
Mesajlar: 28

Yanıt: ajax pagination

deathisonitsway yazdı:

en baştaki where yapısı cok uzun; complexity i artırıyor. bu kadar uzun bir where yapısını aynı kuralda tekrar etmişsiniz.. bu geliştirici için negatif bir etken olmalı..

şöyle yapmalısınız..

$ids=['model_id,'brand_id',........];

foreach ($request->all() as $key=>$value){

if(in_array($key,$ids){
$model = $model->where($key, $value));

}

}

bu şekliyle kodunuz daha kısalmış olur.

çok haklısınız teşekkür ederim hiç aklıma gelmemişdi  bu yöntem

Çevrimdışı

#7 10.08.2018 15:10:06

ak
Üye
Yer: İstanbul
Kayıtlı: 12.07.2014
Mesajlar: 118

Yanıt: ajax pagination

Sayfalama yapmadan tüm veriler çekilip  datatables vb. de kullanabilir.

https://datatables.net/examples/basic_i … ation.html

Çevrimdışı

#8 11.08.2018 23:52:32

nemerki
Üye
Kayıtlı: 23.06.2018
Mesajlar: 28

Yanıt: ajax pagination

ak yazdı:

Sayfalama yapmadan tüm veriler çekilip  datatables vb. de kullanabilir.

https://datatables.net/examples/basic_i … ation.html

bu table için değil mi  ben şöyle bişey pagination yapıyorum

ND23lY.png

bunu datatablela yapmanın  bir yolu varmı ?

Çevrimdışı

Forum alt kısmı