我的模型中有一个十进制字段用于赚钱,我在尝试向此字段添加一些数字时注意到错误的结果。
经过进一步检查,我发现十进制字段被转换为字符串,
比如修补控制台中的decimal(11,3)
。
我检查了表结构,我可以验证该字段确实是String.Format
。
这个问题是asked before,但没有答案。
为什么会这样?
答案 0 :(得分:14)
您需要在模型中定义哪些字段需要转换为基本属性。
protected $casts = [
'my_decimal' => 'float',
];
模型上的
$casts
属性提供了将属性转换为常用数据类型的便捷方法。$casts
属性应该是一个数组,其中键是要转换的属性的名称,值是您希望将列转换为的类型。受支持的演员类型包括:integer
,real
,float
,double
,string
,boolean
,object
,{{ 1}},array
,collection
,date
和datetime
这里有一个很好的解释:
https://mattstauffer.com/blog/laravel-5.0-eloquent-attribute-casting/
文档中也有解释:
https://laravel.com/docs/5.5/eloquent-mutators#attribute-casting
答案 1 :(得分:5)
根据Laravel的github存储库中的这个帖子: https://github.com/laravel/framework/issues/11780
这似乎是一个PDO驱动程序问题。自动将小数转换为字符串。 该线程中的人说这是mysql 5.2驱动程序的问题,有些回滚到5.1。如果你在自己的服务器上,你将能够降级。 否则你必须在模型级别上将它强制转换为浮动。
答案 2 :(得分:2)
我刚刚花了一些时间分析此问题,因为我的Laravel模型将数据库十进制列显示为字符串。
重要的是,将类型转换添加到模型中以进行浮动可以进行修复,但是如果您像我一样,会注意到dd(\App\SomeModel::someScope()->get());
在添加类型转换后仍将那些小数列显示为字符串在模型中。
将这些值发送给客户端时,它们是整数,因此类型转换确实解决了原始问题,因此允许我的JavaScript接收Number
而不是String
。
我只是在回答这个问题,因此一个人不会因为专注于dd()
输出而浪费时间。我研究了有关PDO驱动程序的解决方案,尽管有些解决方案值得一提,但这并不重要,因为实际的数据库输出将转换为正确的类型。
答案 3 :(得分:0)
这就是应该的方式,因为PHP没有十进制类型。如果将小数转换为浮点数,则可能会降低精度。
最好的选择是将其保留为字符串。然后使用bcmath进行操作,该操作可与字符串一起使用。