Eloquent将十进制转换为字符串

时间:2018-01-16 19:29:31

标签: php laravel eloquent decimal

我的模型中有一个十进制字段用于赚钱,我在尝试向此字段添加一些数字时注意到错误的结果。

经过进一步检查,我发现十进制字段被转换为字符串, 比如修补控制台中的decimal(11,3)

我检查了表结构,我可以验证该字段确实是String.Format

这个问题是asked before,但没有答案。

为什么会这样?

4 个答案:

答案 0 :(得分:14)

您需要在模型中定义哪些字段需要转换为基本属性。

protected $casts = [
    'my_decimal' => 'float',
];
  

模型上的$casts属性提供了将属性转换为常用数据类型的便捷方法。 $casts属性应该是一个数组,其中键是要转换的属性的名称,值是您希望将列转换为的类型。受支持的演员类型包括:integerrealfloatdoublestringbooleanobject,{{ 1}},arraycollectiondatedatetime

这里有一个很好的解释:

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进行操作,该操作可与字符串一起使用。