Laravel原生HTML多选下拉框在编辑表单无法获取旧值
解决Laravel原生HTML多选下拉框回显旧值的问题
别发愁,我帮你搞定原生HTML多选下拉框的旧值回显!你遇到的问题是因为Laravel Collective的Form类帮我们封装了选中状态的判断,但原生HTML需要手动处理,其实很简单,用Laravel自带的old()方法结合数组判断就行。
首先先把你的原始代码格式化一下:
<div class="col-xs-12 form-group"> <label class="control-label">Role*</label> <select name="roles[]" data-placeholder="Choose a Role for this User..." multiple> <!-- 这里是你的角色选项 --> </select> </div>
具体解决方案步骤:
- 控制器传递选中的角色ID数组
在你的编辑页面控制器方法里,先获取当前用户已选中的角色ID数组(从数据库读取),同时把所有可选角色也传进视图:
public function edit(User $user) { // 获取用户已拥有的角色ID数组 $selectedRoles = $user->roles->pluck('id')->toArray(); // 获取所有可选角色 $roles = Role::all(); return view('users.edit', compact('user', 'selectedRoles', 'roles')); }
- 在原生HTML下拉框中判断选中状态
在遍历角色选项的时候,用old('roles', $selectedRoles)来获取要对比的数组——这个方法很巧妙:如果用户提交表单后验证失败,old('roles')会优先取提交的旧值;如果是第一次打开编辑页面,就用我们从数据库取的$selectedRoles。然后用in_array()判断当前角色ID是否在这个数组里,是的话就加上selected属性。
最终的HTML代码如下:
<div class="col-xs-12 form-group"> <label class="control-label">Role*</label> <select name="roles[]" multiple data-placeholder="Choose a Role for this User..." class="form-control"> @foreach($roles as $role) <option value="{{ $role->id }}" {{ in_array($role->id, old('roles', $selectedRoles)) ? 'selected' : '' }} > {{ $role->name }} </option> @endforeach </select> </div>
额外注意点:
- 别忘了给select标签加上
multiple属性,否则无法多选 - 如果你的角色数据不是从
Role::all()获取的,根据实际情况调整数据源即可 - 当用户提交表单验证失败时,
old('roles')会自动保留用户之前选中的选项,无需额外处理
内容的提问来源于stack exchange,提问作者manshu
相关产品推荐
相关产品推荐

