[英]Laravel Eloquent - querying pivot table
在我的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']);
}
現在,我可以輕松地獲得經過身份驗證的用戶的項目:
$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
}
},
]
但是我希望將有關用戶角色的信息“注入”到響應中:
[
{
"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",
}
]
},
]
可能嗎? 謝謝
你基本上要求在數據透視表上加載。 問題是,數據透視表中的數據不是來自頂級Model類,因此沒有任何關系方法可供您引用。
您的數據庫結構也有一點尷尬,因為您的數據透視表正在連接三個表而不是兩個表。 在實際回答你的問題后,我會對此有所了解......
因此,您可以通過數據透視表從用戶轉到項目。 您可以通過數據透視表從用戶轉到角色。 但是你要找的是通過數據透視表從項目轉到角色。 (即您所需的數據報顯示項目數據是嵌套'角色'的頂級數據。)。 只有在項目模型是您的入口點而不是您的用戶時才能執行此操作。
首先,在您的項目模型中添加一個多對多關系方法,稱為roles
,並運行您的查詢,如下所示:
app(Projects::class)->with('roles')->wherePivot('user_id', Auth::user()->getKey())->get()
至於結構,我認為你有一點點單一責任違規。 “用戶”代表個人。 但是你也用它來代表項目“參與者”的概念。 我相信您需要一個與User具有多對一關系的新Participant表,以及與Project的一對一關系。 然后您的數據透視表只需要參與者和角色之間的多對多,並讓用戶離開它。
然后您的查詢將如下所示:
Auth::user()->participants()->with(['project', 'roles'])->get()
這也可以讓您有機會添加一些數據來描述整個Particip.status是什么,它們何時與該項目關聯,何時離開該項目,或者他們的主管(parent_participant_id)可能是誰。
我想是的,您可以為項目集合加載角色,在項目模型中定義相同的映射
//Project model
public function roles()
{
return $this->belongsToMany('App\Library\Models\Role', 'project_user_role', 'project_id');
}
並在為項目定義的用戶模型映射中使用預先加載
public function projects()
{
return $this->belongsToMany('App\Library\Models\Project', 'project_user_role')
->with('roles')
->withPivot(['user_id','role_id']);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.