Laravel在json回应中回归

时间:2016-11-23 08:03:47

标签: php json laravel

我正在使用

$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中的所有值转换为字符串类型的最佳方法是什么。

3 个答案:

答案 0 :(得分:3)

类型的差异很可能是由于您的本地服务器正在使用php5-mysqld(非本机)驱动程序,而您的生产服务器可能正在使用php-mysqlnd(本机)驱动程序。其中一个主要区别是非本机驱动程序将所有字段读取为字符串,而本机驱动程序将自动将整数字段转换为PHP整数。

id在两种情况下都显示为整数,因为Laravel会自动将主键字段('id')添加到具有$keyType属性定义的类型的强制转换数组中(默认为{ {1}})。

我想说你有四种选择:

  1. 尝试在生产服务器上安装PHP 7的非本机mysql驱动程序(不推荐)。

  2. 不要在PHP方面做任何事情,只要确保消耗json的任何东西都可以处理字符串或整数(这可能是一个好主意,但仍然无法解决实际问题)。

  3. int添加到postal_code数组,以确保它始终转换为字符串(不错;这适用于大多数情况,但不完全是正确的解决方案)。

  4. casts字段的字段类型从postal_code更改为integervarchar(5)varchar(9),具体取决于您是否'即将存储+4,有或没有连字符(最佳解决方案)。

  5. 将数据库中的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

希望这会有所帮助:)