【问题标题】:Laravel Collection - Return Array of ObjectsLaravel 集合 - 返回对象数组
【发布时间】: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": [
        {...},
        {...}
    ]
}

有点被这个难住了,有人能指导我正确的方向吗?

【问题讨论】:

    标签: arrays json laravel rest collections


    【解决方案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'
                ...
            ],
            [
                ...
            ]
        ]
        

        【讨论】:

          猜你喜欢
          • 2018-12-07
          • 1970-01-01
          • 2021-07-28
          • 2015-04-30
          • 2019-05-18
          • 1970-01-01
          • 2019-04-03
          • 2019-11-27
          • 1970-01-01
          相关资源
          最近更新 更多