Laravel |通过作为对象返回

时间:2018-11-23 20:58:13

标签: laravel eloquent

我正在尝试使用Laravel集合来返回groupBy作为数组。但是,无论如何,它似乎总是作为对象返回的。我尝试做$posts->groupBy('category')->toArray(),但这似乎仍然作为对象返回。我也尝试过$posts->groupBy('category')->all(),但它仍然作为对象返回。

我不知道这是否与Laravel返回路由中的方法有关,但我需要将此作为数组返回。

代码如下:

public function getFeatures($id)
{
    return Feature::query()->get()->groupBy('category')->toArray();
}

实际的代码运行良好,并且我正在获得结果,但似乎并没有转换为数组。谢谢。

2 个答案:

答案 0 :(得分:1)

使用Eloquent查询(可能)获得多个项目时,Laravel will always returnCollection的实例包含所有模型对象。如果需要将它们转换为数组以在视图中使用它们,则可以compact元素。 compact将组成集合元素的关联数组:

public function getFeatures($id)
{
    $features = Feature::all();

    return view('my_cool_view', compact($features));
}

另一方面,如果您需要将它们转换为数组以通过API返回它们,则Laravel默认将响应转换为JSON:

public function getFeatures($id)
{
    return Feature::all();
}

现在,如果您不知何故需要将集合转换为数组,请按照指示使用toArray()

public function getFeatures($id)
{
    $collection_of_features = Feature::all();

    $array_of_features = $collection_of_features->toArray();

    // use it for wherever you want.

}

答案 1 :(得分:0)

通过阅读您对其他答案的评论,我明白了您的意思。

  

您好,@ HCK,谢谢您的回答。 ->toArray()方法似乎不起作用,仍然像{ "category_1": [], "category_2": [] }一样返回,而我需要它来做["category_1": [], "category_2": []]

首先,此答案基于您在控制器上正在执行类似操作(您未发布控制器代码)的猜测:

return reponse()->json($theResponseFromGetFeaturesMethod);

由于在php内部,$theResponseFromGetFeaturesMethod变量包含一个字典数组(类似于["key"=>"value]),当您将其转换为JSON时,您会注意到这种“转换”的发生。

发生这种情况是因为Javascript数组(和JSON)不支持字典数组。请在javascript控制台上查看此示例:

> var a = [];
  undefined
> a['key'] = "value"
  "value"
> a
  > key: "value"
    length: 0
    __proto__: Array(0)

请注意,a的长度仍为零,但现在具有key属性。

发生这种情况是因为javascript上的几乎所有内容实际上都是一个对象。因此,数组是一种特殊的对象,具有pushpop和许多其他数组方法。做array[] = 'somevalue'实际上是array.push('somevalue')的捷径。

因此,您观察到的行为是正确的,toArray()方法按预期工作,并且JSON转换也是如此。


另一种怪异的行为是,当您尝试将此PHP数组转换为JSON时:

[
     0 => 'a'
     1 => 'b'
     9 => 'c'
]

您会注意到,在这种情况下,PHP也会将该数组转换为对象。 JSON中的结果将是:

{
    "0": "a",
    "1": "b",
    "2": "c"
}

这也是预期的行为,因为JSON语法不支持为值定义索引。