当响应为 json 时,Laravel 响应 id 会发生变化,但是在转储数据时,id 就在那里
Posted
技术标签:
【中文标题】当响应为 json 时,Laravel 响应 id 会发生变化,但是在转储数据时,id 就在那里【英文标题】:Laravel response ids change when response is json but when dumping the data the ids are there 【发布时间】:2020-09-22 06:00:50 【问题描述】:我正在尝试在 Laravel 中使用基于 select2 输入搜索记录的 ajax 请求。现在我在获取数据后就对其进行转换,只是为了加密 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)
时,ids 被转换并更正,这是一个示例
#attributes: array:2 [▼
"id" => "eyJpdiI6IlN5YXdzT3hReEc2bnczRGM5YzV1eGc9PSIsInZhbHVlIjoiZ0NpaTRGWjNmS1ZEQjVZcGFZeWJRdz09IiwibWFjIjoiMThmNmQ5YmE5ZDI1MDg4OTZhMmExMTlmNzM0ZGU3ZDRhNzg0OGFhNzM2OTViYzVkN2QxZTUzMzMwMWY4ZDdhYiJ9"
"text" => "Dog name"
]
但是当我使用return response()->json($results)
切换到 JSON 时,它会返回这个
"data":[
"id":0,
"text":"Dog name"
,
"id":0,
"text":"Doggy name"
我不明白为什么它会将 ids 变成 0。这是某种 JSON 清理过程吗?有人可以帮我在 JSON 响应中保留加密的 id 吗?
【问题讨论】:
你也可以分享模型吗? @petersowah 模型和其他一切都是正确的,我可以向你保证。这仅在我尝试切换到 json 时发生 分享模型,看来你有一些规则如何转换为json 刚刚添加了整个模型 添加了它以及扩展它的模型 【参考方案1】:经过一番挖掘,我发现它被自动转换为整数,这引起了一点骚动。所以我通过将public $incrementing = false;
添加到Dogs
模型来解决这个问题
【讨论】:
【参考方案2】:对于其他好奇(如我)为什么会发生这种情况的人:
他正在更改模型主键的类型。当他(或在本例中为JsonResponse
)在模型上调用toJson()
时,它会尝试将该主键(手动更改为string
)转换回它的原始值(int
)并且因为@ 987654326@ 等于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)时,属性会被强制转换。
【讨论】:
以上是关于当响应为 json 时,Laravel 响应 id 会发生变化,但是在转储数据时,id 就在那里的主要内容,如果未能解决你的问题,请参考以下文章
Android HttpUrlConnection Post 方法 - Json - Laravel API 对错误的响应