Laravel实现数据存库自动转大写 解决前端限大写但存库小写问题
问题核心原因
- 前端设置的“仅允许输入大写字母”仅属于页面交互层的限制,部分配置仅做输入提示、无实际拦截逻辑,同时所有前端限制都可通过抓包篡改请求、直接构造HTTP请求等方式完全绕过,不具备强制数据格式的效力。
- 现有控制器代码直接将请求输入值原样赋值给模型属性,未做格式校验与转换,因此请求传什么格式的内容,数据库就会原样存储,最终出现小写格式落库的问题。
可行实现方案
方案1:最小改动快速落地(适配现有控制器代码)
在给模型赋值前,对需要强制大写的字段直接做字符串转大写处理,修改现有store方法即可生效:
public function store(Request $request) { $energy = new Energy; // 对需大写存储的字段做强制格式转换 $energy->energyid = strtoupper($request->input('energyid')); $energy->energydetail = strtoupper($request->input('energydetail')); $energy->save(); return redirect('/page')->with('success', 'data added'); }
方案特点:改动量极小,写完即可生效;但如果后续其他接口也需要写入这两个字段,需要重复写转换逻辑,容易遗漏。
方案2:模型层统一格式约束(长期维护推荐)
在Energy模型中为需要大写存储的字段定义set修改器,所有对该字段的赋值操作都会自动触发大写转换,无需在每个业务节点重复写转换逻辑:
// Energy 模型文件内新增的修改器定义 // energyid 字段赋值时自动转大写 public function setEnergyidAttribute($value) { $this->attributes['energyid'] = strtoupper($value); } // energydetail 字段赋值时自动转大写 public function setEnergydetailAttribute($value) { $this->attributes['energydetail'] = strtoupper($value); }
方案特点:从模型写入的源头统一做格式约束,所有业务场景下对这两个字段的写入都会自动完成大写转换,不会出现漏转换的问题,重复逻辑最少。
方案3:内置类型转换简化代码(适配Laravel 7+版本)
如果使用的Laravel版本支持内置类型转换,可以直接在模型的$casts配置中声明字段为大写格式,效果和手动写修改器完全一致,代码更精简:
// Energy 模型内的$casts属性配置 protected $casts = [ 'energyid' => 'upper', 'energydetail' => 'upper', ];
注意:前端的输入限制仅能优化用户体验,绝对不能作为数据格式校验、转换的唯一依赖,所有涉及数据库持久化的格式要求,必须在后端做强制处理,否则很容易出现非预期格式的数据落库。
内容的提问来源于stack exchange,提问作者Juststartedcoding
相关产品推荐
相关产品推荐

