问题描述
问题
如果一个用户拥有多个角色,我会为他拥有的每个角色获取一个该用户的实例。
说明
我有一个包含三个表的设置,例如 this stackoverflow post 中的描述。
user
表、role
表和 role_user
表。
现在我想用这个查询来查询所有用户的角色:
$allUsers = DB::table('users')
->join('role_user','role_user.user_id','=','users' . '.id')
->join('roles','roles.id','role_user.role_id')
->select(['users.uuid','users.username','users.last_online_at','roles.role','roles.id as role_id'])
->get();
对我来说,它看起来与我在上面已经提到的 stackoverflow 帖子的第二篇文章中制作 Lizesh Shakya 的普通 MysqL 查询建议完全一样。
除了我使用 Laravel 的事实。而且我知道,我可以使用用户模型解决它,并在其中设置适当的 belongsToMany
方法和角色模型。但我想更深入地了解它,因此我尝试这样做。
例如,如果我有三个用户,并且一个用户具有“编辑器”和“作者”角色,则查询将返回四个用户。每个角色一个。
Illuminate\Support\Collection {#1267 ▼
#items: array:4 [▼
0 => {#1273 ▼
+"uuid": "fc8bbd29-9005-4f05-9706-a437933d3bc2"
+"username": "admin"
+"last_online_at": "2021-01-16 19:01:37"
+"role": "admin"
+"role_id": 1
}
1 => {#1272 ▼
+"uuid": "d957e5af-f8f3-4a07-a2c3-eabecbdda618"
+"username": "author1"
+"last_online_at": "2021-01-16 19:01:37"
+"role": "author"
+"role_id": 3
}
2 => {#1282 ▼
+"uuid": "dc94d900-bbaf-4605-b8d8-6bab5fb43b70"
+"username": "editor"
+"last_online_at": "2021-01-16 19:01:37"
+"role": "editor"
+"role_id": 2
}
3 => {#1281 ▼
+"uuid": "d957e5af-f8f3-4a07-a2c3-eabecbdda618"
+"username": "author1"
+"last_online_at": "2021-01-16 19:01:37"
+"role": "editor"
+"role_id": 2
}
]
}
那么我的错在哪里? :)
解决方法
所以,如果我理解正确的话,您想要一份包含其角色的用户列表吗?
在您的用户控制器上:
public function getUsersWithRoles(){
$all_users = User::all()->load('roles');
$body = compact('all_users');
return response()->json(compact('body'));
}
或
public function getUsersWithRoles(){
$all_users = User::with('roles')->get();
$body = compact('all_users');
return response()->json(compact('body'));
}
不要忘记在模型中声明你的关系。