php - Laravel Eloquent toArray 不使用方括号

标签 php json laravel eloquent

我正在编写一个 api 并尝试将一些结果转换为 JSON。当 Eloquent 结果转换为数组时,我期待这样的事情:

[
  {
     "id": "0", ...
  }, 
  {
     "id": "", ...
  }, 
]

相反,Laravel 使用表键将其显示为键值列表:

"0":{
       {
          "id": "0", ...
       }
    },
"1":{
       {
          "id": "1", ...
       }
    }

函数如下:

$results = \App\Event::with('sandboxes')->get()->sortBy('start_time')->forPage($pageNum,$perPage);
    return response()->json(array(
        "events" => $page,
    ));

我怎样才能让 Laravel 给我一个合适的数组?

最佳答案

当您第一次获取事件时,您的Collection 看起来像这样:

[
    0 => Event1,
    1 => Event2,
    2 => Event3
]

这是一个正确索引的数字数组,可以表示为 JSON 中的数组。但是,一旦您获得了 Collection,就可以对其调用 sortBy(),它会对 Collection 中的项目进行排序。这种排序会重新排列数组中项的键和值。此时,您的 Collection 可能类似于:

[
    1 => Event2,
    0 => Event1,
    2 => Event3
]

这不是一个正确索引的数值数组,不能用 JSON 数组表示。该数组必须表示为一个对象,这就是您所看到的。

为了获得您期望的结果,您需要在排序后重新键入 Collection 中的项目。您可以使用 Collection 上的 values() 方法执行此操作(它仅调用内部项数组上的 array_values())。

一旦您重新键入您的收藏,它将看起来像:

[
    0 => Event2,
    1 => Event1,
    2 => Event3
]

现在这是一个正确索引的数字数组,可以表示为 JSON 中的数组。

因此,您的代码应如下所示:

$results = \App\Event::with('sandboxes')
    ->get()
    ->sortBy('start_time')
    ->values() // re-key the items in the collection after sorting
    ->forPage($pageNum, $perPage);

关于php - Laravel Eloquent toArray 不使用方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36231077/

相关文章:

php - 如何查看 mysql 是否替换或插入我的查询

json - 如何传递对象的vue组件props数组?

mysql - 在 laravel 5 中使用自定义代码备份数据库,并从数据库中的每个表中获取最多 10 行的数据

php - 在 Docker 上重启 apache

php - 我应该将整个对象作为函数参数传递吗?

mysql - 在遍历结果集时将数据插入 MySQL

javascript - JSON.parse 在有效 Json 上失败。已转义控制字符。如果

使用 mochiweb 对列表进行 JSON 编码

php - Laravel Blade 布局

laravel - 在数据透视表上使用 hasManyThrough 检索相关模型 - Laravel 5.7