Проблема разбивки на страницы с кэшем в Laravel: получение одинаковых результатов на каждой странице

#laravel #caching #pagination

#laravel #кэширование #разбивка на страницы

Вопрос:

Я использую кэш, но я вижу одни и те же результаты на каждой странице, когда я использую разбивку на страницы. Как я могу это исправить?

Для создания, обновления, редактирования, сохранения я использую Laravel Model Observer.

Мой PostController

 public function allpost(Request $request)
    {
        if($request->cache =='flush')
        {
            Cache::flush();
        }
        $data  =[];
        $posts =Cache::get('posts',[]);

        if(empty($posts))
        {
            $posts = Post::paginate(10);
            Cache::forever('posts',$posts);

        }
        $data['posts'] = $posts ;
        return view('frontend.allpost',$data);
    }
  

Мой ModelObserver

 <?php
namespace AppObservers;
use IlluminateSupportFacadesCache;
class PostObserver
{
    public function created()
    {
        Cache::forget('posts');
    }

    public  function updated()
    {
        Cache::forget('posts');
    }
    public  function saved()
    {
        Cache::forget('posts');
    }

    public  function  deleted()
    {
        Cache::forget('posts');
    }
}
  

Комментарии:

1. Конечно, это так, вы просто разбиваете на страницы первые 10 сообщений. Я думаю, вам нужно кэшировать все сообщения, а затем разбивать результат на страницы.

2. Как разбить страницу на страницы для кэша?

3. Вы chunk размещаете сообщения и получаете часть фрагментированного сообщения, соответствующую страницам. Пожалуйста, ознакомьтесь с коллекцией Laravel здесь laravel.com/docs/8.x/collections#introduction

Ответ №1:

это распространенная проблема. Вы просто кэшируете 10 записей и показываете эти 10 записей на всех страницах. Ваша функция кэша должна писать так :

 $posts = Cache::remember('get-all-posts-' . request('page', 1), 3600, function () {
        return Post::paginate(10);
    });
  

приведенный выше код, записи кэша каждой страницы и ваша проблема исчезнут