【问题标题】:Laravel Nested Query Builder Json ResponseLaravel 嵌套查询生成器 Json 响应
【发布时间】:2017-05-26 12:47:10
【问题描述】:

我正在尝试从查询构建器中获取某种结构,如下所示:

{
  "status": "success",
  "data": {
    "id": 1,
    "email": "test@test.com",
    "birth_date": "1992-08-17",
    "gender": "M",
    "is_active": 1,
    "role": {
      "id": 1,
      "name": "Admin",
      "created_at": "2017-01-11 15:16:14",
      "updated_at": null
    }
  }
}

如您所见,我需要嵌套关系,在本例中为用户到角色。

我可以通过User::with('role') 使用急切加载来获得这个结构。

我有这个查询,但它在一列中返回所有内容。 有什么方法可以使用查询生成器获得相同的结构? 使用急切加载是不好的做法吗?

User::select('users.id', 'users.full_name')
    ->join('roles as r', 'r.id', '=', 'users.role_id')
    ->where('users.id', $user_id)
    ->get();

提前致谢。

【问题讨论】:

    标签: php json laravel eloquent laravel-5.3


    【解决方案1】:

    渴望加载将是“Laravel”方式的最佳实践。假设您有一个 Role 模型并且您的 User 模型具有以下关系:

    public function role()
    {
        return $this->belongsTo(Role::class);
    }
    

    您可以通过以下方式获得所需的回复:

    $user = User::with('role')->find($user_id);
    
    return response()->json(['status' => 'success', 'data' => $user]);
    

    【讨论】:

      【解决方案2】:

      我会说急切加载是最佳做法。它是处理数据的可读和可维护的方式,它可以方便地返回结构化数据等。

      当然,您可以使用 Query Builder 甚至原始查询来获得相同的结果,但最终,您会得到一个无法维护的应用程序。

      所以,我建议你留下来:

      User::with('role')->get();
      

      【讨论】:

        【解决方案3】:

        如果您设置了多对多关系,您可以通过调用关系方法将其添加到您查询的模型中。

        在您的模型中,您可以定义关系:

        public function roles() {
            return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
        }
        

        在您的控制器中,您可以这样访问它:

        $user = User::find(id);
        $user->roles;
        return response()->json($user);
        

        现在您的用户模型将包含所有附加的角色,您可以按照您想要的方式输出它。

        Laravel Eloquent Docs

        【讨论】:

          猜你喜欢
          • 2018-06-02
          • 1970-01-01
          • 1970-01-01
          • 2021-01-01
          • 2016-04-27
          • 2016-11-16
          • 2015-11-17
          • 1970-01-01
          • 2014-02-01
          相关资源
          最近更新 更多