我用的是Laravel 5.5.13。
我成功地测试了我的软糖主机上的所有东西。我现在上传到服务器。
我从phpMyAdmin导出了本地主机中的默认设置(XAMPP,Windows 10),然后使用默认设置在远程phpMyAdmin上进行了导入。
当访问远程主机时,它现在给出了我在迁移中设置的所有字段,如下所示:
$table->integer('extension_id')->unsigned();作为一个字符串,这是如此奇怪,因为当在本地主机,它是作为一个数字。
在下面的数据中,请注意,在localhost中,displayname_id和extensions_id值没有用引号包装。但是id不是,我不明白,它也没有签名。我的目标是使即使是id列都是字符串(如果不可能,则使*_id返回数字)。
这里是来自遥远的地方:
[
{
"id": 2,
"name": "Stencil",
"kind": "cws",
"created_at": "2017-11-11 00:26:52",
"updated_at": "2017-11-11 00:26:52",
"thumbs_count": "1",
"thumbs_yes_count": "0",
"latest_comment": {
"id": 1,
"body": "huh?",
"displayname_id": "1",
"extension_id": "2",
"created_at": "2017-11-11 00:26:56",
"updated_at": "2017-11-11 00:26:56"
}
}
]这里是本地主机:
[
{
"id": 2,
"name": "Stencil",
"kind": "cws",
"created_at": "2017-11-11 00:26:52",
"updated_at": "2017-11-11 00:26:52",
"thumbs_count": "1",
"thumbs_yes_count": "0",
"latest_comment": {
"id": 1,
"body": "huh?",
"displayname_id": 1,
"extension_id": 2,
"created_at": "2017-11-11 00:26:56",
"updated_at": "2017-11-11 00:26:56"
}
}
]这里是我的phpMyAdmin的屏幕:
我的遥控器phpMyAdmin是-

我的本地人是-

下面是表结构的屏幕截图,请注意,id列的列也没有签名,但是它们没有被json_encode编辑成字符串。

下面是导出屏幕截图:https://screenshots.firefoxusercontent.com/images/51d1e47f-fe78-4cdc-8de4-b113d4b576a9.png
以下是导入屏幕截图:https://screenshots.firefoxusercontent.com/images/ff112f86-1c1c-4554-b03c-4b15307c042a.png
发布于 2017-11-11 06:45:35
区别在于您的MySQL客户端驱动程序。本地计算机使用的是MySQL本机驱动程序(mysqlnd),而远程服务器使用的是MySQL客户端库(libmysql)。
本机驱动程序(mysqlnd)将将数据库中的所有整数视为PHP中的整数。但是,客户端库(libmysql)将把所有字段视为PHP中的字符串。
id字段在两台服务器上显示为整数的原因是由于某种Laravel魔术。Laravel使用模型的$casts属性在访问时将特定字段强制转换为特定类型。如果模型上的$incrementing属性是true (默认情况下是true),Laravel将自动将主键字段(默认id)添加到由$keyType属性定义的类型(默认int)的$casts属性中。因此,每当您访问id字段时,它都将是一个PHP整数。
如果希望将整数字段视为整数,则可以在远程服务器上安装MySQL本机驱动程序(mysqlnd)。
如果这不是一个选项,或者不可取,则可以使用$casts属性指定将这些字段视为整数:
protected $casts = [
'displayname_id' => 'int',
'extension_id' => 'int',
];现在,无论使用什么MySQL驱动程序,这两个字段都将被视为整数。
如果希望将id作为字符串处理,则可以使用以下几个选项。
首先,您可以将$keyType值更改为string,但这可能会产生意想不到的后果。例如,relationHasIncrementingId类上的BelongsTo检查密钥是否正在递增,密钥类型是否为int,因此如果将$keyType更改为string,此方法将返回false。
其次,您可以直接将'id' => 'string'添加到$casts数组中,因为$casts值在访问属性时优先于$keyType值。这将比更改$keyType值更安全和语义更正确。
第三,如果您希望将id作为一个字符串处理,只用于JSON转换,则可以重写模型上的jsonSerialize()方法。
public function jsonSerialize()
{
$data = parent::jsonSerialize();
if (isset($data[$this->primaryKey])) {
$data[$this->primaryKey] = $this->castAttribute('string', $data[$this->primaryKey]);
}
return $data;
}发布于 2017-11-11 01:37:42
可以肯定的是,此问题来自您的数据库或php的旧版本< 5.2.9
但是您可以尝试将JSON_NUMERIC_CHECK选项传递给您的json_encode,这样就完成了,它将自动将表示数字的字符串转换为数字:
本地PHP解决方案:
echo json_encode($a, JSON_NUMERIC_CHECK);在线示例
Laravel解决方案:
return response()->json($a, 200, [], JSON_NUMERIC_CHECK);https://stackoverflow.com/questions/47233204
复制相似问题