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 集合 - 返回对象数组的主要内容,如果未能解决你的问题,请参考以下文章

laravel 数据操作

laravel 返回值

Laravel 集合将数组转换为对象

Laravel 查询生成器返回对象或数组?

Laravel 对象到数组

Laravel 5.2 - pluck() 方法返回数组