【问题标题】:How to eager load while retrieving users in laravel?如何在 laravel 中检索用户时急切加载?
【发布时间】:2021-02-09 04:16:28
【问题描述】:

假设我有 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]);
}

这是我的刀片视图,我在其中检索了用户的信息并为该用户分配了角色

@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

我知道我必须在 User 模型中显示一个关系,但我对如何显示一个关系感到困惑。此外,我使用了 spatie 包和身份验证,因此我的用户模型正在扩展 Authenticatable。我对该怎么做感到非常困惑。

【问题讨论】:

标签: laravel authentication eager-loading


【解决方案1】:

在用户模型中,我展示了 belongsToMany 与 model_has_roles 表的关系

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]);
}

然后在我的刀片视图中,我在为分配的用户获取角色时做了一些小改动

@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

然后这减少了我的查询计数。感谢所有对此感兴趣的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2018-09-05
    • 2018-01-27
    • 1970-01-01
    • 2014-08-13
    • 2021-04-23
    相关资源
    最近更新 更多