Laravel Eloquent toArray 不使用方括号

Posted

技术标签:

【中文标题】Laravel Eloquent toArray 不使用方括号【英文标题】:Laravel Eloquent toArray not using square braces 【发布时间】:2016-07-13 20:48:21 【问题描述】:

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

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

但是,Laravel 使用 table 键将其显示为键值列表:

"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】:

当您第一次收到您的事件时,您的 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);

【讨论】:

以上是关于Laravel Eloquent toArray 不使用方括号的主要内容,如果未能解决你的问题,请参考以下文章

Laravel,获得类似 Eloquent 使用查询生成器的结果

Laravel Eloquent 不区分大小写的查询

Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化

laravel怎么把对象转换为数组

Eloquent 只获取一列作为数组

laravel5 怎么获取数组形式的数据