Laravel8(Blade/Controller)多对多关联下复选框值更新问题排查
Laravel多对多权限复选框更新问题修复方案
1. 先修正模型关联定义(核心问题)
你是多对多关联,必须在App/Models/User.php中定义正确的belongsToMany关联,指定自定义中间表和外键:
// 方法名可以保留你原来的userPermissions,建议改成permissions语义更清晰 public function permissions() { // 四个参数分别为:关联模型类、中间表名、当前模型在中间表的外键、关联模型在中间表的外键 return $this->belongsToMany(Permission::class, 'userpermissions', 'id_user', 'id_permission'); }
2. 控制器方法修正
update方法问题修复
原代码用save()处理多对多关联完全错误,多对多更新应该用sync()方法,会自动同步选中/未选中的权限,自动删除取消勾选的旧关联,新增新勾选的关联:
public function update(UserRequest $request, User $user) { $user->update($request->only('name', 'email')); // 第二个参数空数组是默认值,避免用户没选任何权限时请求无此字段报错 $user->permissions()->sync($request->input('data', [])); return redirect()->back()->with('status','user updated !'); }
store方法问题修复
原代码用createMany()错误,而且没有加密密码,修正如下:
public function store(UserRequest $request) { $validated = $this->validate($request, [ 'name' => 'required', 'email'=>'required|email|unique:users,email', 'password' => 'required|confirmed|min:6', ]); // 密码必须加密存储,不能直接存明文 $validated['password'] = bcrypt($validated['password']); $user = User::create($validated); // 多对多新增关联用attach方法 $user->permissions()->attach($request->input('data', [])); return redirect()->back()->with('status','Utilisateur ajouté !'); }
3. 视图代码优化(可选,更符合Laravel写法)
可以用Blade自带的@checked指令替换原生PHP判断,代码更简洁:
<input type="checkbox" name="data[]" value="{{ $permission->id }}" @checked(in_array($permission->id, $user->permissions->pluck('id')->toArray()))> {{ $permission->name }}
如果保留原来的userPermissions关联名,把上面的permissions换成userPermissions即可。
内容的提问来源于stack exchange,提问作者aresdev
相关产品推荐
相关产品推荐

