Laravel Eloquent toArray不使用方括号

时间:2016-03-26 02:47:42

标签: php json laravel eloquent

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

[
  {
     "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给我一个合适的阵列?

1 个答案:

答案 0 :(得分:3)

当您第一次收到活动时,Collection看起来像这样:

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

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

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

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

为了获得您期望的结果,您需要在排序后重新键入Collection中的项目。您可以使用values()上的Collection方法执行此操作(只需在内部项目数组上调用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);