如何从数据库填充 select 选项 - Spatie 权限包 - Laravel
How to populate the select opition from Database - Spatie Permission package - Laravel
我正在关注这篇文章,为 Spatie/permissions 提出前端 UI。
每一部分我都能理解,但我无法理解特定部分,
请导航到角色部分,(请搜索'roles.edit',它将直接转到节)
在编辑视图中,作者正在使用代码,
<h5><b>Assign Permissions</b></h5>
@foreach ($permissions as $permission)
{{Form::checkbox('permissions[]', $permission->id, $role->permissions ) }}
{{Form::label($permission->name, ucfirst($permission->name)) }}<br>
@endforeach
我的理解是表单集合使用第三个参数作为检查字段。
当我运行输出传递给第三个字段
{{$role->permissions }}
我得到这种格式的结果
[{"id":1,"name":"Permission","guard_name":"web","created_at":"2019-08-04
05:53:14","updated_at":"2019-08-04
05:53:14","pivot":{"role_id":9,"permission_id":1}},
我不确定 laravel 集体如何解析结果。
用于编辑的作者控制器
public function edit($id) {
$role = Role::findOrFail($id);
$permissions = Permission::all();
return view('roles.edit', compact('role', 'permissions'));
}
这是我克服这个问题的方法,顺便说一句,我没有使用集体
我的编辑控制器
public function edit($id)
{
$role = Role::find($id);
$roles_permissions = Role::findByName($role->name)->permissions;
$permissions = Permission::all();
return view('admin.userrole.role.edit', compact('role', 'permissions','roles_permissions'));
}
我的 Blade 文件
<h4>Assign Permission</h4>
<div class='form-group'>
<p>
Existing Permissions:
@foreach ($roles_permissions as $item)
<span class="badge badge-success"> {{$item->name}}</span>
@endforeach
</p>
<p> {{$role->permissions}}</p>
<select name="permissions[]" id="permissions" multiple class="form-control">
@foreach ($roles_permissions as $item)
<option value="{{$item->id}}" selected hidden></option>
<span class="badge badge-success"> {{$item->name}}</span>
@endforeach
<option value="" selected>
</option>
@foreach ($permissions as $permission)
<option value="{{$permission->id}}" checked="{{$role->permissions}}">{!!ucfirst($permission->name)!!}
</option>
@endforeach
</select>
</div>
我确信这不是实现此目的的正确方法。请让我知道如何填充权限
select 字段。
注意:如果提出问题,请注明原因。这样我就可以改进我的演示文稿。我非常感谢你的努力。谢谢
有几个问题应该可以帮助您完成这项工作。 LaravelCollective 表单 (HTML) 库很棒,但也需要一点时间来适应。
在 controller 端,您当前正在从以下行将完整权限对象列表发送回表单:
$permissions = Permission::all();
或者,正如作者的表单所做的那样,他们只是从特定 $role
中提取那些权限。无论哪种方式,缺少的部分是控制器将完整的对象发送回表单,这将无法像当前编码那样工作。 select
框只需要 name
和 id
。
所以 控制器 应该只使用 pluck 收集那些字段:
$permissions = Permission::orderBy('name')->pluck('name', 'id');
然后,在您的 blade 页面上,权限选项将与 select 部分正确对齐:
{{Form::select('permissions[]', $permissions, null, [//classes, placeholder, multiple, etc] ) }}
注意这里的一些事情 - $permissions
是 第二个参数 ,而不是第三个。此外,您不需要指定 $permission->id
,这是通过 form-model-binding
与 Collective 自动完成的。相反,使用 null 它将绑定到您绑定到表单的 user
上。如果你不是使用表单模型绑定,你可以自己写使用第3个参数而不是null
:
{{Form::select('permissions[]', $permissions, (isset($user->permission_id)? $user->permission_id: [null=>'Please Select']), [//classes, placeholder, multiple etc] ) }}
表单模型绑定非常棒,并且允许您像上面那样使用 null
...这并不难 - 您只需要使用正确的模型打开表单。这超出了这个问题的范围,但请查看 Collective 文档以获取有关如何执行此操作的示例。
我正在关注这篇文章,为 Spatie/permissions 提出前端 UI。
每一部分我都能理解,但我无法理解特定部分,
请导航到角色部分,(请搜索'roles.edit',它将直接转到节)
在编辑视图中,作者正在使用代码,
<h5><b>Assign Permissions</b></h5>
@foreach ($permissions as $permission)
{{Form::checkbox('permissions[]', $permission->id, $role->permissions ) }}
{{Form::label($permission->name, ucfirst($permission->name)) }}<br>
@endforeach
我的理解是表单集合使用第三个参数作为检查字段。
当我运行输出传递给第三个字段
{{$role->permissions }}
我得到这种格式的结果
[{"id":1,"name":"Permission","guard_name":"web","created_at":"2019-08-04 05:53:14","updated_at":"2019-08-04 05:53:14","pivot":{"role_id":9,"permission_id":1}},
我不确定 laravel 集体如何解析结果。
用于编辑的作者控制器
public function edit($id) {
$role = Role::findOrFail($id);
$permissions = Permission::all();
return view('roles.edit', compact('role', 'permissions'));
}
这是我克服这个问题的方法,顺便说一句,我没有使用集体
我的编辑控制器
public function edit($id)
{
$role = Role::find($id);
$roles_permissions = Role::findByName($role->name)->permissions;
$permissions = Permission::all();
return view('admin.userrole.role.edit', compact('role', 'permissions','roles_permissions'));
}
我的 Blade 文件
<h4>Assign Permission</h4>
<div class='form-group'>
<p>
Existing Permissions:
@foreach ($roles_permissions as $item)
<span class="badge badge-success"> {{$item->name}}</span>
@endforeach
</p>
<p> {{$role->permissions}}</p>
<select name="permissions[]" id="permissions" multiple class="form-control">
@foreach ($roles_permissions as $item)
<option value="{{$item->id}}" selected hidden></option>
<span class="badge badge-success"> {{$item->name}}</span>
@endforeach
<option value="" selected>
</option>
@foreach ($permissions as $permission)
<option value="{{$permission->id}}" checked="{{$role->permissions}}">{!!ucfirst($permission->name)!!}
</option>
@endforeach
</select>
</div>
我确信这不是实现此目的的正确方法。请让我知道如何填充权限 select 字段。
注意:如果提出问题,请注明原因。这样我就可以改进我的演示文稿。我非常感谢你的努力。谢谢
有几个问题应该可以帮助您完成这项工作。 LaravelCollective 表单 (HTML) 库很棒,但也需要一点时间来适应。
在 controller 端,您当前正在从以下行将完整权限对象列表发送回表单:
$permissions = Permission::all();
或者,正如作者的表单所做的那样,他们只是从特定 $role
中提取那些权限。无论哪种方式,缺少的部分是控制器将完整的对象发送回表单,这将无法像当前编码那样工作。 select
框只需要 name
和 id
。
所以 控制器 应该只使用 pluck 收集那些字段:
$permissions = Permission::orderBy('name')->pluck('name', 'id');
然后,在您的 blade 页面上,权限选项将与 select 部分正确对齐:
{{Form::select('permissions[]', $permissions, null, [//classes, placeholder, multiple, etc] ) }}
注意这里的一些事情 - $permissions
是 第二个参数 ,而不是第三个。此外,您不需要指定 $permission->id
,这是通过 form-model-binding
与 Collective 自动完成的。相反,使用 null 它将绑定到您绑定到表单的 user
上。如果你不是使用表单模型绑定,你可以自己写使用第3个参数而不是null
:
{{Form::select('permissions[]', $permissions, (isset($user->permission_id)? $user->permission_id: [null=>'Please Select']), [//classes, placeholder, multiple etc] ) }}
表单模型绑定非常棒,并且允许您像上面那样使用 null
...这并不难 - 您只需要使用正确的模型打开表单。这超出了这个问题的范围,但请查看 Collective 文档以获取有关如何执行此操作的示例。