use*_*304 2 php laravel eloquent
在我的 Laravel 应用程序中,我有三个数据库表,分别称为用户、项目和角色。它们之间存在 m:n 关系,因此我还有名为 project_user_role 的数据透视表。数据透视表包含 user_id、project_id 和 role_id 列。请参阅 MySQL Workbench 的屏幕截图。
我的用户、项目和角色模型定义了belongsToMany关系,如下所示:
//User model example
public function projects()
{
return $this->belongsToMany('App\Library\Models\Project', 'project_user_role')->withPivot(['user_id','role_id']);
}
Run Code Online (Sandbox Code Playgroud)
现在我可以轻松获取经过身份验证的用户的项目,如下所示:
$user = Auth::user();
$projects = $user->projects;
Run Code Online (Sandbox Code Playgroud)
响应看起来像这样:
[
{
"id": 1,
"name": "Test project",
"user_id": 1,
"created_at": "2018-05-01 01:02:03",
"updated_at": "2018-05-01 01:02:03",
"pivot": {
"user_id": 2,
"project_id": 17,
"role_id": 1
}
},
]
Run Code Online (Sandbox Code Playgroud)
但我想将有关用户角色的信息“注入”到响应中,例如:
[
{
"id": 1,
"name": "Test project",
"user_id": 1,
"created_at": "2018-05-01 01:02:03",
"updated_at": "2018-05-01 01:02:03",
"pivot": {
"user_id": 2,
"project_id": 17,
"role_id": 1
},
roles: [
{
"id": 1,
"name": "some role name",
"display_name": "Some role name",
"description": "Some role name",
"created_at": "2018-05-01 01:02:03",
"updated_at": "2018-05-01 01:02:03",
}
]
},
]
Run Code Online (Sandbox Code Playgroud)
是否可以?谢谢
您本质上是在请求数据透视表上的急切加载。问题是,数据透视表中的数据不是来自顶级模型类,因此没有任何关系方法可供您参考。
您的数据库结构也有一点尴尬,因为您的数据透视表连接了三个表而不是两个表。在实际回答你的问题之后,我会对此进行一些思考......
因此,您可以通过数据透视表从用户转到项目。您可以通过数据透视表从用户转到角色。但您要寻找的是通过该数据透视表从项目转到角色。(即您想要的数据报将项目数据显示为具有嵌套“角色”的顶层。)。仅当项目模型是您的入口点而不是用户时才能完成此操作。
因此,首先向您的项目模型添加一个名为 的多对多关系方法roles,然后像这样运行查询:
app(Projects::class)->with('roles')->wherePivot('user_id', Auth::user()->getKey())->get()
Run Code Online (Sandbox Code Playgroud)
至于结构,我认为你那里有一点单一责任违规。“用户”代表个人。但您还使用它来表示项目“参与者”的概念。我相信您需要一个新的参与者表,该表与用户具有多对一关系,与项目具有一对一关系。那么您的数据透视表只需是参与者和角色之间的多对多,并将用户排除在外。
那么你的查询将如下所示:
Auth::user()->participants()->with(['project', 'roles'])->get()
Run Code Online (Sandbox Code Playgroud)
这也让您有机会添加一些数据来描述诸如总体参与者状态、他们何时与该项目关联、何时离开该项目或者他们的主管 (parent_participant_id) 可能是谁等数据。