为何MySQL存储的decimal类型值在Laravel页面输出时显示为整数
问题原因及解决方案
核心原因
你遇到的问题是Laravel模型的属性自动转换逻辑导致的,dd()打印模型时输出的是原始数据库查询结果,而直接访问属性时会触发模型的属性处理逻辑,丢失小数部分的常见原因如下:
- 模型
$casts配置错误
你的Quotation模型中大概率将cost字段的转换类型设置为了integer,错误配置示例:
protected $casts = [ 'cost' => 'integer', ];
只需要将其修改为保留两位小数的decimal类型即可:
protected $casts = [ 'cost' => 'decimal:2', ];
- 自定义访问器逻辑错误
检查Quotation模型中是否定义了getCostAttribute方法,里面如果有强制转整数、取整的逻辑,就会导致小数部分丢失,比如:
public function getCostAttribute($value) { return intval($value); }
删除错误的转换逻辑,或者修改为保留两位小数的处理即可。
- 父类/引用Trait的属性处理逻辑错误
如果Quotation模型继承了自定义父类、或者引用了处理属性的Trait,重写了getAttribute方法并对数值字段做了统一整数转换,也会出现该问题,排查对应逻辑修改即可。
内容的提问来源于stack exchange,提问作者Ahmed Naveed
相关产品推荐
相关产品推荐

