Laravel从缓存加载设置

时间:2019-03-19 00:05:15

标签: php laravel caching

我正在使用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 :(得分:0)

这很简单。有关详细信息,请咨询the docs on caching,但是基本思想是:

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

您还可以将所有所有设置缓存到单个缓存值中。取决于有多少设置以及您在平均请求中使用的比例,这是一个好方法,也可能不是一个好方法。

答案 1 :(得分:-1)

尝试

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;