在我的Laravel应用程序中,我有三个数据库表,分别称为users、projects和roles。它们之间存在m:n关系,所以我也有一个称为PROJECT_USER_ROLE的透视表。透视表包含user_id、project_id和role_id列。请参见MySQL工作台的屏幕截图。
我的用户、项目和角色模型得到了如下定义的归属关系:
//User model example
public function projects()
{
return $this->belongsToMany('App\Library\Models\Project', 'project_user_role')->withPivot(['user_id','role_id']);
}
现在我可以很容易地获得通过身份验证的用户的项目:
$user = Auth::user();
$projects = $user->projects;
对此的回应是这样的:
[
{
"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
}
},
]
但我想将有关用户角色的信息“注入”到响应likat中:
[
{
"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",
}
]
},
]
有可能吗?谢谢
您实际上是要求对数据透视表进行一个急切加载。问题是,数据透视表中的数据不是来自顶级模型类,所以关系方法中没有任何东西可供您参考。
DB结构也有一点不正常,因为透视表连接的是三个表,而不是两个表。在回答你的问题之后,我会对此有一些想法。
因此,您可以通过数据透视表从用户到项目。并且可以通过透视表从用户转到角色。但您需要的是通过透视表从项目到角色。(即,您所需的数据报显示了具有嵌套“角色”的顶级项目数据。)只有当项目模型是您的入口点而不是您的用户时,才能这样做。
因此,首先向项目模型添加一个名为roles
的多对多关系方法,并如下所示运行查询:
app(Projects::class)->with('roles')->wherePivot('user_id', Auth::user()->getKey())->get()
至于结构,我认为你有一点单一责任的违反。“用户”代表个人。但是你也用它来表示一个项目的“参与者”的概念。我相信您需要一个新的Participant表,它与User有多对一的关系,与Project有一对一的关系。那么您的数据透视表只需要是参与者和角色之间的多对多,而不需要用户。
那么您的查询将如下所示:
Auth::user()->participants()->with(['project', 'roles'])->get()
这也使您有机会添加一些数据来描述诸如总体参与者的状态、他们何时与该项目关联、何时离开该项目,或者他们的主管(PARENT_PARPTIANT_ID)可能是谁。