Laravel: кэш с пагинацией - PullRequest
       25

Laravel: кэш с пагинацией

2 голосов
/ 24 апреля 2020

У меня есть laravel (7.x) приложение. Я недавно добавил функциональность кеша для повышения производительности. После реализации функции кеширования у меня возникли проблемы с разбивкой на страницы при загрузке данных в формате сетки, поэтому я поискал в поиске решения и обнаружил это Разбиение на страницы с кешем в Laravel.

Хотя, это действительно решило мою проблему. Но дело в том, что у меня есть около 100 страниц, и благодаря найденному решению каждая страница имеет свой собственный кэш. Теперь, если я создаю или обновляю какую-либо запись, она не отражается в сетке, потому что данные загружаются из кеша.

PostController. php:

...

$arraySearch = request()->all();

# calculating selected tab
$cache = (!empty(request()->inactive)) ? 'inactive' : 'active';
$cacheKey = strtoupper("{$this->controller}-index-{$cache}-{$arraySearch['page']}");

# caching the fetch data
$arrayModels = cache()->remember($cacheKey, 1440, function() use ($arraySearch) {
    # models
    $Post = new Post();

    # returning
    return [
        'active'   => $Post->_index(1, 'active', $arraySearch),
        'inactive' => $Post->_index(0, 'inactive', $arraySearch),
    ];
});

...

Post. php:

public function _index($status = 1, $page = null, $arraySearch = null)
{
    ...

    $Self = self::where('status', $status)
        ->orderBy('status', 'ASC')
        ->orderBy('title', 'ASC')
        ->paginate(10);

    ...

    return $Self;
}

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

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

PostController. php:

public function index()
{
    ...

    $arraySearch = request()->all();

    # calculating selected tab
    $cache = (!empty(request()->inactive)) ? 'inactive' : 'active';
    $cacheKey = strtoupper("{$this->controller}-index-{$cache}-{$arraySearch['page']}");

    # caching the fetch data
    $arrayModels = cache()->remember($cacheKey, 1440, function() use ($arraySearch) {
        # models
        $Post = new Post();

        # returning
        return [
            'active'   => $Post->_index(1, 'active', $arraySearch),
            'inactive' => $Post->_index(0, 'inactive', $arraySearch),
        ];
    });

    ...
}

public function store()
{
    ...

    Artisan::call('cache:clear');

    ...
}

Я выложу правильное решение, когда найду его. До тех пор, пока я использую это.

0 голосов
/ 24 апреля 2020

1. Хранить все страницы под одним тегом:

Как видно из документации: https://laravel.com/docs/master/cache#storing -tagged-cache-items Вы можете использовать теги для группировки кэшированных элементов.

    $cacheTag = strtoupper("{$this->controller}-index-{$cache}");
    $arrayModels = cache()->tags([$cacheTag])->remember($cacheKey, 1440, function() use ($arraySearch) {
        ...

2. Установите прослушиватель событий в Post, чтобы очистить тег

. Вы можете запустить прослушиватель событий для событий Post update () или create (). https://laravel.com/docs/7.x/eloquent#events -using-closures

Затем вы можете очистить кэш тегов, используя

    Cache::tags([$cacheTag])->flush();
...