php Eloquent将十进制转换为字符串

50pmv0ei  于 2023-08-02  发布在  PHP
关注(0)|答案(5)|浏览(142)

我有一个十进制字段来表示我的口才模型中的钱,我注意到错误的结果时,试图添加一些数字到这个字段。
经过进一步的检查,我发现十进制字段被强制转换为字符串,就像tinker控制台中的"1245114.00"一样。
我检查了表结构,可以验证字段确实是decimal(11,3)
这个问题是asked before,但没有答案。
为什么会这样?

pkmbmrz7

pkmbmrz71#

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

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

字符串
模型上的$casts属性提供了将属性转换为通用数据类型的方便方法。$casts属性应该是一个数组,其中键是要转换的属性的名称,值是您希望将列转换为的类型。支持的强制转换类型包括:integerrealfloatdoublestringbooleanobjectarraycollectiondatedatetimetimestamp
这里有一个很好的解释:
https://mattstauffer.com/blog/laravel-5.0-eloquent-attribute-casting/
在文档中也有解释:
https://laravel.com/docs/5.5/eloquent-mutators#attribute-casting

yqhsw0fo

yqhsw0fo2#

根据Laravel的github仓库的这个帖子:https://github.com/laravel/framework/issues/11780
这似乎是PDO驱动程序的问题。自动将小数转换为字符串。这个帖子中的人说这是mysql 5.2驱动程序的问题,有些人回滚到5.1。如果你在自己的服务器上,你可以降级。否则,您将不得不将其转换为浮动模型级别。

zyfwsgd6

zyfwsgd63#

因为PHP没有decimal类型,所以应该是这样的。如果将decimal转换为float,则可能会丢失精度。
最好的选择是让它保持原样,作为字符串。然后使用bcmath进行操作,这意味着要与字符串一起使用。

lo8azlld

lo8azlld4#

我只是花了一些时间分析这个问题,因为我的Laravel模型将数据库十进制列显示为字符串。
重要的是,在模型中添加类型转换以float确实修复了它,但如果你像我一样,你会注意到在模型中添加类型转换后,dd(\App\SomeModel::someScope()->get());仍然将这些十进制列显示为字符串。
当这些值被发送到客户端时,它们是整数,所以类型转换确实解决了最初的问题,从而允许我的JavaScript接收Number而不是String
我只是做这个答案,所以一个人不会浪费时间,由于专注于dd()输出。我研究了关于PDO驱动程序的解决方案,虽然有些解决方案可能有其优点,但这不是什么大问题,因为真实的的数据库输出被转换为正确的类型。

nfeuvbwi

nfeuvbwi5#

请注意,0.000会给予你真实。
要获取其数值或进行比较:
或者

$value = +$model->number_field_decimal

字符串
或者

$value = 1*$model->number_field_decimal

相关问题