如何优化Laravel中多次调用Setting模型更新配置的重复代码?
Laravel 配置更新代码优化方案
你当前的写法重复调用了查询构造器,每更新一条配置就会发起一次数据库请求,冗余度高且性能差,可通过以下两种方式优化:
方案1:白名单遍历更新(改动最小,适合少量配置)
提前定义允许更新的配置键白名单,通过遍历完成更新,后续新增配置只需修改白名单数组即可,无需重复写查询逻辑:
// 配置白名单,禁止直接传入请求所有字段,避免非法篡改其他配置 $allowKeys = ['online_course', 'read_item', 'comment_item', 'rate_item']; foreach ($allowKeys as $key) { // 仅更新请求中存在的字段 if ($request->has($key)) { Setting::where('key', $key)->update(['value' => $request->input($key)]); } }
方案2:批量Upsert更新(性能最优,适合多配置场景)
如果你的settings表已经给key字段加上了唯一索引,可以直接用Laravel原生的upsert方法,仅发起一次数据库请求完成所有更新,性能远高于多次查询:
$allowKeys = ['online_course', 'read_item', 'comment_item', 'rate_item']; // 构造待更新数据集 $updateData = collect($allowKeys) ->filter(fn($key) => $request->has($key)) ->map(fn($key) => [ 'key' => $key, 'value' => $request->input($key) ]) ->toArray(); // 第一个参数是待更新数据,第二个是唯一识别字段,第三个是需要更新的字段 Setting::upsert($updateData, ['key'], ['value']);
额外优化建议
- 可以把批量更新的逻辑封装到
Setting模型的自定义方法中,比如新增public static function batchUpdate(array $data)方法,后续业务调用只需传入符合要求的数组即可,维护统一更简洁。 - 如果有表单校验需求,可搭配验证器先对请求参数做合法性校验,再执行更新逻辑。
内容的提问来源于stack exchange,提问作者zanko
相关产品推荐
相关产品推荐

