带有 keyBy 的 Laravel 响应返回对象而不是数组

Posted

技术标签:

【中文标题】带有 keyBy 的 Laravel 响应返回对象而不是数组【英文标题】:Laravel response with keyBy returns object instead and array 【发布时间】:2015-04-14 21:12:31 【问题描述】:

我正在开发一个项目,使用 Laravel 设置后端 RESTful API,使用 angularJS 设置前端。 我从我的控制器@index 返回简单的all()->toArray(),如下所示:

一个。

return Response::json([
    'val' => myModel::all()->toArray()
]);

然后,使用 Angular 中的对象,我可以执行 $scope.myArray=response.val 之类的操作,并最终执行 $scope.myArrayBoundToATable.push(newelement) 之类的操作。如果通过 id 键入结果 JSON 会更好,所以我将其更改为:

乙。

return Response::json([
    'res' => myModel::all()->keyBy('id')->toArray()
]);

但是现在像.splice.push 这样的所有函数都会引发错误。通过登录到控制台,我可以看到: 使用all()->toArray():[Object] 一切正常。 keyBy('id')->toArray() : Object 1: Object

我必须将 $scope.myVar 上的 CRUD 操作重写为 JS 对象,而不是数组。

我可以使用方法 A. 并迭代每个元素以搜索 ID,但方法 B. 允许我以更优雅的方式访问元素:$scope.myVar(ID)

【问题讨论】:

嗯,是的,这就是预期的结果。 JSON(和 javascript)不知道关联数组,所以它被转换成一个对象,每个 id 都有一个属性。 我认为你说得对,我没有意识到这一点(我的错,缺乏深刻的概念)。这没有什么大问题,我可以解决这些函数来执行 CRUD 操作以与非数组对象一起使用,并且'到现在为止 angular 都很好地支持它们(对于像 ng-repeat、ng-option 之类的东西)。现在我在实现类似codepen.io/jbltx/pen/WbdRRb 的东西时遇到了麻烦。这个 table 指令依赖于结构良好的 JSON 数组,并且对于重新排序、分页和类似的东西,它需要数组。我将继续阅读以更好地处理绑定到视图的数据。谢谢。 【参考方案1】:

正如@lukasgieter 所指出的,这是一个关联数组。 为了便于前端使用,只需使用 array_values 将关联数组转换为常规数组

这是我的处理方式。

Response::json(['val' => array_values(myModel::all())]);

【讨论】:

以上是关于带有 keyBy 的 Laravel 响应返回对象而不是数组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent / keyBy不适用于相关实体

Laravel Eloquent 关系 keyBy()

keyBy() 不会更改键。拉拉维尔 5.5

Laravel Eloquent,返回带有“belongsTo”对象的 JSON?

Laravel 中的 Ajax 请求返回一个空对象

在 PHP / Laravel 中以抽象的方式包装 JSON 响应