在调用关系-Laravel之后访问目标表的列



我有三个表,如下

基本表

users
id - integer
name - string

目标表

roles
id - integer
name - string

数据透视表

role_user
user_id - integer
role_id - integer

usersroles表之间存在多对多关系

如果我想要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();

最新更新