Laravel 当响应为 json 时,响应 ID 发生变化,但是当转储数据时,ID 在那里
Laravel response ids change when response is json but when dumping the data the ids are there
我正在尝试在 Laravel 中使用 ajax 请求,它根据 select2 输入搜索记录。现在我在获取数据后对其进行转换,只是为了加密 ID。这是我获取记录并将其 id 转换为加密的方式。
public function autocompletePedigree($subdomain, $type = null)
{
$q = request()->get('q');
$sex = NULL;
if (!is_null($type)) {
$sex = $this->sexesRepository->make()->where('name', $type)->first(['id'])->id;
}
$results = $this->dogsRepository->search($q, $sex);
$results->getCollection()->transform(function ($value) {
$value->id = encrypt($value->id);
return $value;
});
return $results;
}
现在结果包含狗的名字和 id,当我使用 dd($results)
时,id 被转换并更正这是一个例子
#attributes: array:2 [▼
"id" => "eyJpdiI6IlN5YXdzT3hReEc2bnczRGM5YzV1eGc9PSIsInZhbHVlIjoiZ0NpaTRGWjNmS1ZEQjVZcGFZeWJRdz09IiwibWFjIjoiMThmNmQ5YmE5ZDI1MDg4OTZhMmExMTlmNzM0ZGU3ZDRhNzg0OGFhNzM2OTViYzVkN2QxZTUzMzMwMWY4ZDdhYiJ9"
"text" => "Dog name"
]
但是当我使用 return response()->json($results)
切换到 JSON 时 returns 这个
"data":[
{
"id":0,
"text":"Dog name"
},
{
"id":0,
"text":"Doggy name"
}
我不明白为什么它会将 id 变成 0。这是某种 JSON 清理过程吗?有人可以帮我在 JSON 响应中保留加密的 ID 吗?
经过一点点挖掘,我发现它被自动转换为整数,这引起了一点轰动。所以我通过将 public $incrementing = false;
添加到 Dogs
模型
来解决这个问题
对于其他对为什么会这样感到好奇的人(比如我):
他正在更改模型主键的类型。当他(或在本例中为 JsonResponse
)在模型上调用 toJson()
时,它会尝试将该主键(已手动更改为 string
)转换回其原始值(int
) 并且由于 (int) "eyJpdiI6IlN ..."
等于 0
他的密钥也是 0
。
发生这种情况是因为主键实际上是模型的 added to the $casts
property:
public function getCasts()
{
if ($this->getIncrementing()) {
return array_merge([$this->getKeyName() => $this->getKeyType()], $this->casts);
}
return $this->casts;
}
... 并且当模型被序列化为一个数组时(以及稍后序列化为 JSON)将转换属性。
我正在尝试在 Laravel 中使用 ajax 请求,它根据 select2 输入搜索记录。现在我在获取数据后对其进行转换,只是为了加密 ID。这是我获取记录并将其 id 转换为加密的方式。
public function autocompletePedigree($subdomain, $type = null)
{
$q = request()->get('q');
$sex = NULL;
if (!is_null($type)) {
$sex = $this->sexesRepository->make()->where('name', $type)->first(['id'])->id;
}
$results = $this->dogsRepository->search($q, $sex);
$results->getCollection()->transform(function ($value) {
$value->id = encrypt($value->id);
return $value;
});
return $results;
}
现在结果包含狗的名字和 id,当我使用 dd($results)
时,id 被转换并更正这是一个例子
#attributes: array:2 [▼
"id" => "eyJpdiI6IlN5YXdzT3hReEc2bnczRGM5YzV1eGc9PSIsInZhbHVlIjoiZ0NpaTRGWjNmS1ZEQjVZcGFZeWJRdz09IiwibWFjIjoiMThmNmQ5YmE5ZDI1MDg4OTZhMmExMTlmNzM0ZGU3ZDRhNzg0OGFhNzM2OTViYzVkN2QxZTUzMzMwMWY4ZDdhYiJ9"
"text" => "Dog name"
]
但是当我使用 return response()->json($results)
切换到 JSON 时 returns 这个
"data":[
{
"id":0,
"text":"Dog name"
},
{
"id":0,
"text":"Doggy name"
}
我不明白为什么它会将 id 变成 0。这是某种 JSON 清理过程吗?有人可以帮我在 JSON 响应中保留加密的 ID 吗?
经过一点点挖掘,我发现它被自动转换为整数,这引起了一点轰动。所以我通过将 public $incrementing = false;
添加到 Dogs
模型
对于其他对为什么会这样感到好奇的人(比如我):
他正在更改模型主键的类型。当他(或在本例中为 JsonResponse
)在模型上调用 toJson()
时,它会尝试将该主键(已手动更改为 string
)转换回其原始值(int
) 并且由于 (int) "eyJpdiI6IlN ..."
等于 0
他的密钥也是 0
。
发生这种情况是因为主键实际上是模型的 added to the $casts
property:
public function getCasts()
{
if ($this->getIncrementing()) {
return array_merge([$this->getKeyName() => $this->getKeyType()], $this->casts);
}
return $this->casts;
}
... 并且当模型被序列化为一个数组时(以及稍后序列化为 JSON)将转换属性。