gpt4 book ai didi

mysql - 上传到服务器后,输出json的所有数字都是字符串

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:13 25 4
gpt4 key购买 nike

我正在使用 Laravel 5.5.13。

我在我的 loclahost 上成功测试了所有内容。我现在上传到服务器。

我在本地主机(XAMPP、Windows 10)中使用默认设置从 phpMyAdmin 导出,然后使用默认设置在远程 phpMyAdmin 上导入。

当命中远程主机时,它现在会提供我在迁移中设置的所有字段,如下所示:

$table->integer('extension_id')->unsigned();

作为一个字符串,这很奇怪,因为在本地主机上,它给出的是一个数字。

在下面的数据中,请注意,在 localhost 中,displayname_idextensions_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

最佳答案

不同之处在于您的 MySQL 客户端驱动程序。您的本地计算机正在使用 MySQL native 驱动程序 (mysqlnd),而您的远程服务器正在使用 MySQL 客户端库 (libmysql)。

native 驱动程序 (mysqlnd) 会将数据库中的所有整数视为 PHP 中的整数。但是,客户端库 (libmysql) 会将所有字段视为 PHP 中的字符串。

id 字段在两台服务器上显示为整数的原因是 Laravel 的魔法。 Laravel 使用模型的 $casts 属性在访问时将特定字段转换为特定类型。如果您的模型上的 $incrementing 属性是 true(默认情况下),Laravel 会自动添加主键字段(默认 id)到 $casts 属性,其类型由 $keyType 属性定义(默认 int)。因此,无论何时访问 id 字段,它都将是一个 PHP 整数。

如果您希望整数字段被视为整数,您可以在远程服务器上安装 MySQL native 驱动程序 (mysqlnd)。

如果这不是一个选项,或者不合需要,您可以使用 $casts 属性指定将这些字段视为整数:

protected $casts = [
'displayname_id' => 'int',
'extension_id' => 'int',
];

现在无论使用何种 MySQL 驱动程序,这两个字段都将被视为整数。

如果您希望将 id 视为字符串,您有几个选择。

首先,您可以将 $keyType 值更改为 string,但这可能会产生意想不到的后果。例如,BelongsTo 类上的 relationHasIncrementingId 检查键是否递增以及键类型是否为 int,因此此方法将返回 false如果您将 $keyType 更改为 string

其次,您可以直接将 '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;
}

关于mysql - 上传到服务器后,输出json的所有数字都是字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com