Настройки загрузки Laravel из кеша - PullRequest
1 голос
/ 19 марта 2019

Я использую Laravel 5.7 и сохраняю настройки в базе данных.

public function store(Request $request)
{
    $data = $request->only('app_name', 'app_desc', 'company_phone', 'company_address',
        'service_wage', 'kavenegar_api', 'kavenegar_number'
    );

    foreach ($data as $key => $value) {
        Setting::updateOrInsert(
            ['name' => $key],
            ['val' => $value]
        );
    }

    return redirect()->back()->withFlashSuccess("saved");
}

Я могу получить настройки с помощью следующего помощника.

if (!function_exists('getSetting')) {
    function getSetting($key)
    {
        return Setting::where('name', $key)->value('val');
    }
}

Но естьпроблема;Мы перечисляем все настройки и вызываем getSetting ('setting_name') несколько раз, что делает один запрос к базе данных для каждого вызова.Это очень много запросов для получения настроек.

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

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

попробуйте

if (!function_exists('getSetting')) 
{
    function getSetting($key)
    {
        return Setting::where('name', $key)->first()->val;
    }
}

И не забудьте добавить Пространство имен App\Setting

Как работает функция

Например, еслиу вас есть настройка с именем app_name и пока вы передаете значение функции

Setting::where('name', $key)->first()->val;

getSetting('app_name');, он найдет first record с помощью клавиши app_name и выберет поле valзначение из объекта и возвращает его

ОБНОВЛЕНО ДЛЯ КЭША

ЭТО НЕПРОВЕРЕННАЯ ФУНКЦИЯ

function getSetting($name)
    {
        if (Cache::has('setting_'.$name)) {
            return Cache::get('setting_'.$name);
        }

        $query = Setting::where('name', $key)->first();
        Cache::forever('setting_'.$name, $query->val);
        return $query->val;
    }

Это будетзапомните кеш навсегда и посетите документацию, чтобы прочитать о cache

https://laravel.com/docs/5.8/cache

И не забудьте добавить use Illuminate\Support\Facades\Cache; в список пространств имен

0 голосов
/ 19 марта 2019

Это довольно просто.Обратитесь к документам по кешированию за подробностями, но основная идея такова:

function getSetting($key)
{
    return Cache::remember('setting:' . $key, 3600, function() use($key) {
        return Setting::where('name',$key)->value('val');
    });
}

Вы также можете кэшировать все настроек в одно значение кэша.В зависимости от того, сколько настроек есть и какую пропорцию вы используете в среднем запросе, это может быть или не быть хорошим подходом.

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