我有一个十进制字段来表示我的口才模型中的钱,我注意到错误的结果时,试图添加一些数字到这个字段。
经过进一步的检查,我发现十进制字段被强制转换为字符串,就像tinker控制台中的"1245114.00"
一样。
我检查了表结构,可以验证字段确实是decimal(11,3)
。
这个问题是asked before,但没有答案。
为什么会这样?
我有一个十进制字段来表示我的口才模型中的钱,我注意到错误的结果时,试图添加一些数字到这个字段。
经过进一步的检查,我发现十进制字段被强制转换为字符串,就像tinker控制台中的"1245114.00"
一样。
我检查了表结构,可以验证字段确实是decimal(11,3)
。
这个问题是asked before,但没有答案。
为什么会这样?
5条答案
按热度按时间pkmbmrz71#
您需要在模型中定义哪些字段需要转换为原始属性。
字符串
模型上的
$casts
属性提供了将属性转换为通用数据类型的方便方法。$casts
属性应该是一个数组,其中键是要转换的属性的名称,值是您希望将列转换为的类型。支持的强制转换类型包括:integer
、real
、float
、double
、string
、boolean
、object
、array
、collection
、date
、datetime
和timestamp
这里有一个很好的解释:
https://mattstauffer.com/blog/laravel-5.0-eloquent-attribute-casting/
在文档中也有解释:
https://laravel.com/docs/5.5/eloquent-mutators#attribute-casting
yqhsw0fo2#
根据Laravel的github仓库的这个帖子:https://github.com/laravel/framework/issues/11780
这似乎是PDO驱动程序的问题。自动将小数转换为字符串。这个帖子中的人说这是mysql 5.2驱动程序的问题,有些人回滚到5.1。如果你在自己的服务器上,你可以降级。否则,您将不得不将其转换为浮动模型级别。
zyfwsgd63#
因为PHP没有decimal类型,所以应该是这样的。如果将decimal转换为float,则可能会丢失精度。
最好的选择是让它保持原样,作为字符串。然后使用bcmath进行操作,这意味着要与字符串一起使用。
lo8azlld4#
我只是花了一些时间分析这个问题,因为我的Laravel模型将数据库十进制列显示为字符串。
重要的是,在模型中添加类型转换以float确实修复了它,但如果你像我一样,你会注意到在模型中添加类型转换后,
dd(\App\SomeModel::someScope()->get());
仍然将这些十进制列显示为字符串。当这些值被发送到客户端时,它们是整数,所以类型转换确实解决了最初的问题,从而允许我的JavaScript接收
Number
而不是String
。我只是做这个答案,所以一个人不会浪费时间,由于专注于
dd()
输出。我研究了关于PDO驱动程序的解决方案,虽然有些解决方案可能有其优点,但这不是什么大问题,因为真实的的数据库输出被转换为正确的类型。nfeuvbwi5#
请注意,0.000会给予你真实。
要获取其数值或进行比较:
或者
字符串
或者
型