【发布时间】:2015-06-30 19:17:03
【问题描述】:
在 Laravel 5 中遇到了一个我正在努力解决的问题。
所以基本上我要做的就是将用户拥有的所有角色都称为与编辑用户相关的表单。其中一部分是首先遍历角色,以便使用复选框将它们全部显示出来。
然后它应该填充所有用户角色,即如果用户具有管理员和 VIP 角色,则应勾选这些框。如果选中或确实未选中其他角色,则需要将这些更改传回控制器进行更新。
所以我有一个用户 - Roles_User - 角色模型和相关表。枢轴设置为一个(用户)到多个(角色)。所有这些都运行良好。
我使用以下命令在控制器中调用编辑用户表单:
public function edit($id)
{
//
$user = User::with('roles')->findOrFail($id);
return view('admin.users.edit')->with('user', $user);
}
不要让整个表格让你感到厌烦,除了我一直在摆弄的这部分之外,所有这些都很好。
<div class="form-group">
@foreach (App\Http\Models\Role::all() as $role)
{!! Form::Label('name', $role->name) !!}
{!! Form::checkbox('role[]', $role->id, @if($user->hasRole($role
->id) true @endif, ['class' => 'form-control']) !!}
@endforeach
</div>
这确实会返回表中的所有角色,每个角色都有一个复选框。
我已将 ID 设置为 role->id 以确保我可以将其带回控制器。我正在努力解决的问题是根据用户当前角色设置值,这会返回错误。
@if($user->hasRole($role->id) true @endif
在我的用户模型中,我有这样的“hasRole”方法,以便确定用户是否具有角色。
public function hasRole($id)
{
foreach ($this->roles as $role)
{
if ($role->id == $id) return true;
}
return false;
}
我不确定我是否在这里遗漏了一些非常明显的东西,或者我是否以完全错误的方式看待它。我还没有设置角色同步,在这个阶段我只是试图让角色正确填充,然后我可以更新用户记录。
感谢您的帮助。
解决方案
好的,这就是我应该输入的内容。
{!! Form::checkbox('userrole[]', $role->id, $user->hasRole($role->id),
['class' => 'field']) !!}
这使用 userrole[] 为用户角色创建了一个数组,foreach 进入并检查用户是否有角色并将复选框设置为 true。
请记住,当我调用 $user->hasRole 时,它会访问 User 类中的 hasRole 方法。
$role->id 确保数组知道我们指的是角色表中的哪个角色。
然后,编辑记录的用户可以选中其他或取消选中选中的角色,并且数组将在提交时携带这些更改。因为该数组将具有已检查的角色 ID,当然也知道用户 ID。
在用户添加或删除角色后返回用户角色数组时,我会使用 usersController 中的 Laravel 同步选项,如下所示:
$user->roles()->sync(Input::get('userrole'));
这会将用户角色与提交表单时从输入中获取的数组 userroles[] 同步。
【问题讨论】: