Laravel集合-对象的返回数组

时间:2019-09-03 03:16:34

标签: arrays json laravel rest collections

因此,我尝试使用以下代码使用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": [
        {...},
        {...}
    ]
}

对此感到困惑,有人可以引导我朝正确的方向前进吗?

4 个答案:

答案 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'
        ...
    ],
    [
        ...
    ]
]