我正在尝试使用Laravel集合来返回groupBy
作为数组。但是,无论如何,它似乎总是作为对象返回的。我尝试做$posts->groupBy('category')->toArray()
,但这似乎仍然作为对象返回。我也尝试过$posts->groupBy('category')->all()
,但它仍然作为对象返回。
我不知道这是否与Laravel返回路由中的方法有关,但我需要将此作为数组返回。
代码如下:
public function getFeatures($id)
{
return Feature::query()->get()->groupBy('category')->toArray();
}
实际的代码运行良好,并且我正在获得结果,但似乎并没有转换为数组。谢谢。
答案 0 :(得分:1)
使用Eloquent查询(可能)获得多个项目时,Laravel will always return类Collection的实例包含所有模型对象。如果需要将它们转换为数组以在视图中使用它们,则可以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上的几乎所有内容实际上都是一个对象。因此,数组是一种特殊的对象,具有push
,pop
和许多其他数组方法。做array[] = 'somevalue'
实际上是array.push('somevalue')
的捷径。
因此,您观察到的行为是正确的,toArray()
方法按预期工作,并且JSON转换也是如此。
另一种怪异的行为是,当您尝试将此PHP数组转换为JSON时:
[
0 => 'a'
1 => 'b'
9 => 'c'
]
您会注意到,在这种情况下,PHP也会将该数组转换为对象。 JSON中的结果将是:
{
"0": "a",
"1": "b",
"2": "c"
}
这也是预期的行为,因为JSON语法不支持为值定义索引。