我正在使用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'),这将为每个调用向数据库查询一次。要进行设置,要进行很多查询。
我想使用缓存,但是当设置存储在数据库中时如何处理?我还将它们保存在缓存中。
答案 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;