因此,我尝试使用以下代码使用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": [
{...},
{...}
]
}
对此感到困惑,有人可以引导我朝正确的方向前进吗?
答案 0 :(得分:5)
返回如下响应时,可以使用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()
]);
答案 1 :(得分:1)
问题在于我没有重新设置数组的基数,因为它跳过了一些键。我通过像这样简单地使用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())]);
答案 2 :(得分:1)
我认为您会发现在数据库查询中执行此操作会更好地提高性能。
类似这样的东西:
$rooms = Room::whereHas('users', function(user) use ($username) {
return $user == $username
})
->with('messages')
->get();
答案 3 :(得分:0)
要返回对象数组,可以使用 all 方法。
它不返回对象集合,而是返回对象数组。
例如,User::all();
返回一个 Eloquent 集合,其结构如下:
[
{App\User},
{App\User},
{App\User}
]
然而,其他答案建议使用 ->toArray()
返回一个 arrays 数组,而不是一个 objects 数组,例如:
[
[
'id' => 123,
'name' => 'example'
...
],
[
...
]
]