如何向登录用户检索的角色添加条件

How to add condition to the Roles retrieved by logged user

我在 Laravel-5.8 应用程序中使用 Spatie RBAC

我的用户控制器和视图中有这段代码:

用户控制器

public function create()
{
    $roles = Role::get()->pluck('name', 'name');
    return view('admin.users.create', compact('roles','companies'));
}

public function edit(User $user)
{
    $companies = OrgCompany::all();
    $roles = Role::get()->pluck('name', 'name');

    return view('admin.users.edit', compact('roles', 'user','companies'));
}

查看

<div class="form-group {{ $errors->has('roles') ? 'has-error' : '' }}">
    <label for="roles">
        {{ trans('global.user.fields.roles') }}*
        <span class="btn btn-info btn-xs select-all">Select all</span>
        <span class="btn btn-info btn-xs deselect-all">Deselect all</span>
    </label>
    <select name="roles[]" id="roles" class="form-control select2" multiple="multiple">
        @foreach($roles as $id => $roles)
            <option value="{{ $id }}" {{ (in_array($id, old( 'roles', [])) || isset($user) && $user->roles->contains($id)) ? 'selected' : '' }}> {{ $roles }}
        </option>
        @endforeach
    </select>

    @if($errors->has('roles'))
        <p class="help-block">
            {{ $errors->first('roles') }}
        </p>
    @endif
</div>

如果登录用户的角色不是“超级管理员”,角色 select 下拉列表应检索除“超级管理员”以外的其他角色。但是如果登录的用户是“超级管理员”,它应该检索包括“超级管理员”在内的所有角色。

如果 $request->user 没有角色 Super Admin

,您可以使用 when 过滤角色
public function create(Request $request)
{
    $roles = Role::query()
        ->when(! $request->user->hasRole('Super Admin'), function($query) {
            return $query->where('name', '!=', 'Super Admin');
        })
        ->get()
        ->pluck('name', 'name');

    return view('admin.users.create', compact('roles','companies'));
}

public function edit(Request $request, User $user)
{
    $companies = OrgCompany::all();
    $roles = Role::query()
        ->when(! $request->user->hasRole('Super Admin'), function($query) {
            return $query->where('name', '!=', 'Super Admin');
        })
        ->get()
        ->pluck('name', 'name');

    return view('admin.users.edit', compact('roles', 'user','companies'));
}