Laravel中decimal字段验证最佳实践及amount_settle字段校验方法
Laravel decimal(15,2) 字段验证最佳实践
针对你迁移中定义的decimal('amount_settle', 15, 2)字段,验证规则需要覆盖三个核心要求:合法数值格式、小数位数不超过2位、数值范围不超过字段允许的上限(13位整数+2位小数),具体实现方案如下:
控制器直接校验写法
这是最常用的轻量化方案,直接在控制器的请求验证中定义规则即可:
public function store(Request $request) { $validated = $request->validate([ // 其他字段验证规则... 'amount_settle' => [ 'required', // 非必填可移除该规则 'numeric', 'min:0', // 结算金额不允许为负时保留,允许负数可调整为对应最小值或移除 'max:9999999999999.99', // 对应decimal(15,2)的最大允许值 'regex:/^\d+(\.\d{1,2})?$/' // 严格限制小数位数最多2位 ] ]); // 后续业务逻辑... }
各规则作用说明:
numeric:确保提交值为合法数值,支持字符串格式的数值(比如前端传的"123.45"也能正常识别)max:避免数值超过字段存储上限,触发数据库报错regex:防止提交3位及以上小数的数值,避免数据库自动四舍五入导致数据和实际提交值不一致
全局复用方案
如果项目中多处需要用到decimal(15,2)格式的验证,可以自定义全局验证规则,减少重复代码:
- 在
app/Providers/AppServiceProvider.php的boot方法中注册规则:
use Illuminate\Support\Facades\Validator; public function boot() { // 自定义decimal(15,2)验证规则 Validator::extend('decimal_15_2', function ($attribute, $value) { return is_numeric($value) && preg_match('/^-?\d+(\.\d{1,2})?$/', $value) // 允许负数的版本,不需要负数就去掉-? && $value <= 9999999999999.99 && $value >= -9999999999999.99; }); // 自定义错误提示 Validator::replacer('decimal_15_2', function ($message) { return '该字段必须是最多13位整数、2位小数的合法数值'; }); }
- 控制器中直接调用规则:
$validated = $request->validate([ 'amount_settle' => ['required', 'min:0', 'decimal_15_2'] ]);
注意事项
- 如果前端提交的数值带千分位分隔符(比如
1,234.56),需要先通过中间件或请求预处理去掉逗号,再走验证逻辑,否则numeric规则会校验失败 - 不要仅依赖
between或min/max规则,这类规则只会校验数值大小,不会限制小数位数,容易出现精度丢失问题 - 如果业务允许小数位数为0(即整数),上述正则已经覆盖该场景,不需要额外调整
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

