Laravel продолжает получать тот же самый результат кэша, даже если я ввожу другое ключевое слово поиска - PullRequest
0 голосов
/ 20 января 2020

Я получил запрос API, в котором есть параметр, который является именем проекта. Проблема в том, что, когда я ищу, например, A, результаты будут A, но когда я буду искать B, результат будет до A, даже если я буду искать C, результат останется прежним. Я думаю, что кеш сохранил первые результаты из первой строки поиска. У меня вопрос, как я могу сохранить все результаты в каждом поисковом запросе, не получая тот же результат на основе поискового запроса?

Вот мой код

 public function getRecordDetails(Request $request){

        if(!empty($request->limit)){
            $limit = " LIMIT ".$_REQUEST['limit'];
        }
        else{
            $limit= '';
        }

        if(empty($request->projectname)){
            dd('Field is empty');
        }
        else{

            $data = Cache::rememberForever('results', function () use($request) {
                $result =  DB::connection('mysql2')
                ->table('xp_pn_ura_transactions')
                ->whereRaw(DB::raw("CONCAT(block, ' ', street,' ',project_name,' ', postal_code,'')LIKE '%$request->projectname%' order by STR_TO_DATE(sale_date, '%d-%M-%Y') desc"))
                ->limit($request->limit)
                ->distinct()
                ->get();

                $count =  DB::connection('mysql2')
                ->table('xp_pn_ura_transactions')
                ->whereRaw(DB::raw("CONCAT(block, ' ', street,' ',project_name,' ', postal_code,'')LIKE '%$request->projectname%'"))
                ->count();


                return json_encode(array('count'=>$count,'result'=>$result));
            });

            return $data;
        }
    }

PS: Этот вопрос основан здесь Как я могу кэшировать каждый результат API-ответа в моем запросе в Laravel? Я ответил здесь, но это другая проблема, основанная на моем ответе. Спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 20 января 2020

Laravel найти кеш по ключу. Вы используете results в качестве ключа.

Так что независимо от того, какой другой запрос вы передадите. Он все еще может найти кеш по results.

, поэтому он вернет первый кеш, который вы храните в results.

$key = "results:".$request->projectname.':' $request->limit;
Cache::rememberForever($key, function () use ($request) {
    ...
}

В этом хранилище будут храниться все различные projectname вы request.

Однако

Задача 1:

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

Решение:

Или вы можете использовать remember() вместо rememberForever()

$ttl = ????; // Find the appropriate time to expire the cache
$value = Cache::remember($key, $ttl, function () {});

Задача 2:

В вашем кэше $request->limit.

Это означает, что кто-то вставит или удалит запись в этой таблице. В следующий раз, когда вы сделаете запрос с другим limit, вы столкнетесь с дублированными записями.

Решение:

Поэтому я думаю, что вы можете очистить кеш после того, как вы create, update или delete записей.

3 голосов
/ 20 января 2020

Потому что вы используете один и тот же кусок кеша снова и снова. Вы должны изменить слаг кеша в соответствии с измененным вводом. Добавление $request в качестве аргумента использования к вашей функции не приведет к магическому изменению слага кеша.

В вашем случае это должно работать:

Cache::rememberForever("results_{$request->projectname}", function () use ($request) {
0 голосов
/ 08 марта 2020

Вы должны добавить текстовое значение после и перед идентификатором ключа, как bello

Cache::rememberForever('product_'.$product->id.'_key',function ()

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...