Laravel 集合 - 返回对象数组
Posted
技术标签:
【中文标题】Laravel 集合 - 返回对象数组【英文标题】:Laravel Collection - Return Array of Objects 【发布时间】:2020-01-05 22:40:16 【问题描述】:所以我尝试使用以下代码返回一个包含我的 Laravel 集合的对象数组:
/**
* View a user's chat rooms.
*
* return \Illuminate\Http\Response|\Laravel\Lumen\Http\ResponseFactory\
*/
public function viewChatRooms()
$user = Auth::user(); // @var User $user
$username = $user->username;
$rooms = Room::with('messages')->get()
->filter(function ($val) use ($username)
foreach ($val->users as $user)
if($user === $username)
return $val;
);
return response(['rooms' => $rooms]);
响应返回以下内容,而不是返回对象数组:
"rooms":
"0": ...,
"3": ...
这是想要的结果:
"rooms": [
...,
...
]
有点被这个难住了,有人能指导我正确的方向吗?
【问题讨论】:
【参考方案1】:在返回响应时可以使用 PHP 的 array_value 函数:
return response()->json([
'rooms' => array_values($rooms->toArray())
]);
仅获取 Collection 值的 Laravel 集合方法
https://laravel.com/docs/5.8/collections#method-values
所以
return response()->json([
'rooms' => $rooms->values()->toArray()
]);
【讨论】:
谢谢,第二个答案完美。我会使用whereHas
,但没有直接的用户关系,因为数据库以 json 格式存储用户名,因此不允许我使用最后一个答案。【参考方案2】:
问题是我没有对数组进行变基,因为它跳过了几个键。我通过简单地使用array_values()
来修复它,如下所示:
$rooms = Room::with('messages')->get()
->filter(function ($val) use ($username)
foreach ($val->users as $user)
if($user === $username)
return $val;
);
return response(['rooms' => array_values($rooms->toArray())]);
【讨论】:
【参考方案3】:我认为您会发现在数据库查询中执行此操作会提高性能。
类似这样的:
$rooms = Room::whereHas('users', function(user) use ($username)
return $user == $username
)
->with('messages')
->get();
【讨论】:
【参考方案4】:要返回一个对象数组,可以使用all 方法。
它不是返回一个对象集合,而是返回一个对象数组。
例如,User::all();
返回一个结构如下的 Eloquent 集合:
[
App\User,
App\User,
App\User
]
而其他答案建议使用 ->toArray()
,它返回 arrays 数组,而不是 objects 数组,例如:
[
[
'id' => 123,
'name' => 'example'
...
],
[
...
]
]
【讨论】:
以上是关于Laravel 集合 - 返回对象数组的主要内容,如果未能解决你的问题,请参考以下文章