我有三个表,如下
基本表
users
id - integer
name - string
目标表
roles
id - integer
name - string
数据透视表
role_user
user_id - integer
role_id - integer
users
和roles
表之间存在多对多关系
如果我想要role_id为'1'的所有用户,那么我可以作为简单地执行此操作
$result = User::whereHas('roles', function ($q){
$q->where('roles.id', 1);
});
但我也希望角色名称对应于role_id'1',它是roles
表的name
列。
有什么方法可以将角色名称附加到$result
集合中吗。
我认为您可能想要使用map()
。不过,为了防止查询中出现N+1问题,急切加载(with()
(非常重要。如果不急于加载,结果中的每个用户都会执行一个额外的查询。
$result = AppUser::query()
->with([
'roles' => function ($q) {
$q->whereId(1);
}
])
->whereHas('roles', function ($q) {
$q->whereId(1);
})
->get()
->map(function ($user) {
$user['name'] = $user->roles->first()->name;
return $user;
});
您可以Eagleload关系以获得您想要的列:
User::whereHas('roles', function ($q){
$q->where('roles.id', 1);
})->with(['roles' => function ($q){
$q->select('name')->where('roles.id', 1);
}])->get();