如何在 laravel 中检索用户时预先加载?
How to eager load while retrieving users in laravel?
假设我有 20 个用户,他们的角色是管理员、代理、经理和客户。在获取所有 20 个用户时,它触发了 21 个查询。我想急于加载这个。
获取所有用户时 20 个触发查询中的一个查询示例。
select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` = 1 and `model_has_roles`.`model_type` = 'App\Models\User'
这是我的控制器
public function index(){
$data=User::get();
$info=Role::get();
$permi=Permission::get();
return view('admin.role',['userinfo'=>$data, 'roleinfo'=>$info,'per'=>$permi]);
}
这是我的 blade 视图,我在其中检索了用户信息并为该用户分配了角色
@foreach ($userinfo as $users)
<tr>
<th scope="row">{{ $users->id }}</th>
<td>{{ $users->name }}</td>
<td>{{ $users->email }}</td>
<td>
@if(!empty($users->getRoleNames()))
@foreach($users->getRoleNames() as $v)
<label class="badge badge-success">{{ $v }}</label>
@endforeach
@endif
</td>
</tr>
@endforeach
我知道我必须在用户模型中显示关系,但我对如何显示关系感到困惑。另外,我使用了 spatie 包和 auth,所以我的用户模型正在扩展 Authenticatable。我非常困惑该怎么做。
在用户模型中,我显示了 belongsToMany
与 model_has_roles
table
的关系
function role(){
return $this->belongsToMany(Role::Class, 'model_has_roles','model_id','role_id');
}
然后在我的控制器中
public function index(){
$data=User::with('role')->get();
$info=Role::get();
$permi=Permission::get();
return view('admin.role',['userinfo'=>$data, 'roleinfo'=>$info,'per'=>$permi]);
}
然后在我的 blade 视图中,我在获取分配给用户的角色时做了一些小改动
@foreach ($userinfo as $users)
<tr>
<th scope="row">{{ $users->id }}</th>
<td>{{ $users->name }}</td>
<td>{{ $users->email }}</td>
<td>
@if(!empty($users->role))
@foreach($users->role as $v)
<label class="badge badge-success">{{ $v->name }}</label>
@endforeach
@endif
</td>
</tr>
@endforeach
然后这减少了我的查询次数。感谢所有对此感兴趣的人。
假设我有 20 个用户,他们的角色是管理员、代理、经理和客户。在获取所有 20 个用户时,它触发了 21 个查询。我想急于加载这个。
获取所有用户时 20 个触发查询中的一个查询示例。
select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` = 1 and `model_has_roles`.`model_type` = 'App\Models\User'
这是我的控制器
public function index(){
$data=User::get();
$info=Role::get();
$permi=Permission::get();
return view('admin.role',['userinfo'=>$data, 'roleinfo'=>$info,'per'=>$permi]);
}
这是我的 blade 视图,我在其中检索了用户信息并为该用户分配了角色
@foreach ($userinfo as $users)
<tr>
<th scope="row">{{ $users->id }}</th>
<td>{{ $users->name }}</td>
<td>{{ $users->email }}</td>
<td>
@if(!empty($users->getRoleNames()))
@foreach($users->getRoleNames() as $v)
<label class="badge badge-success">{{ $v }}</label>
@endforeach
@endif
</td>
</tr>
@endforeach
我知道我必须在用户模型中显示关系,但我对如何显示关系感到困惑。另外,我使用了 spatie 包和 auth,所以我的用户模型正在扩展 Authenticatable。我非常困惑该怎么做。
在用户模型中,我显示了 belongsToMany
与 model_has_roles
table
function role(){
return $this->belongsToMany(Role::Class, 'model_has_roles','model_id','role_id');
}
然后在我的控制器中
public function index(){
$data=User::with('role')->get();
$info=Role::get();
$permi=Permission::get();
return view('admin.role',['userinfo'=>$data, 'roleinfo'=>$info,'per'=>$permi]);
}
然后在我的 blade 视图中,我在获取分配给用户的角色时做了一些小改动
@foreach ($userinfo as $users)
<tr>
<th scope="row">{{ $users->id }}</th>
<td>{{ $users->name }}</td>
<td>{{ $users->email }}</td>
<td>
@if(!empty($users->role))
@foreach($users->role as $v)
<label class="badge badge-success">{{ $v->name }}</label>
@endforeach
@endif
</td>
</tr>
@endforeach
然后这减少了我的查询次数。感谢所有对此感兴趣的人。