当响应为 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 就在那里的主要内容,如果未能解决你的问题,请参考以下文章

Laravel AJAX 响应

Laravel:用 UTF-8 编码 JSON 响应

Android HttpUrlConnection Post 方法 - Json - Laravel API 对错误的响应

Laravel 中的 JSON 响应

使用自定义 json 响应进行 Laravel 验证

Laravel - 使用唯一的 JSON 响应结构不正确