我正在使用
$user = User::find($user_id);
return response()->json(array('user'=>$user),200);
在使用php5.9的本地服务器上,它返回除id作为字符串之外的所有键。
{
"success": "1",
"message": "success",
"user": {
"id": 75,
"name": "",
"postal_code": "73733",
}
}
但是使用php7.0的生产服务器上的相同代码返回类型为integer ex的其他键。检查这个postal_code值。
{
"success": "1",
"message": "success",
"user": {
"id": 75,
"name": "",
"postal_code": 73733,
}
}
所以解决这个问题我在User.php中使用$cast=[]
。
但我也使用过原始查询。将响应json中的所有值转换为字符串类型的最佳方法是什么。
答案 0 :(得分:3)
类型的差异很可能是由于您的本地服务器正在使用php5-mysqld
(非本机)驱动程序,而您的生产服务器可能正在使用php-mysqlnd
(本机)驱动程序。其中一个主要区别是非本机驱动程序将所有字段读取为字符串,而本机驱动程序将自动将整数字段转换为PHP整数。
id
在两种情况下都显示为整数,因为Laravel会自动将主键字段('id')添加到具有$keyType
属性定义的类型的强制转换数组中(默认为{ {1}})。
我想说你有四种选择:
尝试在生产服务器上安装PHP 7的非本机mysql驱动程序(不推荐)。
不要在PHP方面做任何事情,只要确保消耗json的任何东西都可以处理字符串或整数(这可能是一个好主意,但仍然无法解决实际问题)。
将int
添加到postal_code
数组,以确保它始终转换为字符串(不错;这适用于大多数情况,但不完全是正确的解决方案)。
将casts
字段的字段类型从postal_code
更改为integer
,varchar(5)
或varchar(9)
,具体取决于您是否'即将存储+4,有或没有连字符(最佳解决方案)。
将数据库中的varchar(10)
数据类型更改为postal_code
确实是最佳选择。主要原因是,虽然它们由数字组成,但邮政编码本质上不是整数或数字。你永远不会用它们做任何算术。此外,还有以前导0开头的邮政编码,如果该值存储为整数,则这是一个额外的边缘情况条件,每当显示邮政编码时都要与之抗争。
答案 1 :(得分:1)
启用PDO :: ATTR_STRINGIFY_FETCHES设置将解决此问题。您可以在数据库配置下添加此PDO设置。
'options' => array(
PDO::ATTR_STRINGIFY_FETCHES => true,
),
答案 2 :(得分:0)
您可以转换为字符串,如:
$user['postal_code'] = (string) $user['postal_code'];
有关变量类型转换的更多信息,请参见PHP manual。
希望这会有所帮助:)