Laravel通过复选框更新多对多关联数据及编辑时关联同步方案咨询
实现步骤
1. 修正edit方法传参
你原有edit方法中选中值取的是首条图书的关联数据,不符合编辑当前图书的需求,需改为取当前编辑$book的对应值,同时多对多关联要取出所有已关联的仓库ID组成数组:
public function edit(Book $book) { $authors = Author::all(); $selectedAuthor = $book->author_id; $publishers = Publisher::all(); $selectedPublisher = $book->publisher_id; $warehouses = Warehouse::all(); // 取出当前图书已关联的所有仓库ID数组 $selectedWarehouses = $book->warehouses->pluck('id')->toArray(); return view('books.edit', compact( 'book', 'authors', 'publishers', 'warehouses', 'selectedAuthor', 'selectedPublisher', 'selectedWarehouses' )); }
2. 修改视图复选框代码
新增默认选中判断,使用Laravel内置的@checked指令实现已关联仓库默认勾选:
@foreach($warehouses as $warehouse) <input type="checkbox" name="checked[]" value="{{ $warehouse->id }}" @checked(in_array($warehouse->id, $selectedWarehouses)) > {{ $warehouse->address }} <br/> @endforeach
3. 完善update方法的关联同步逻辑
直接使用Laravel多对多关联提供的sync方法即可,它会自动完成「删除取消勾选的关联、新增新勾选的关联」的逻辑,不需要手动编写attach/detach代码:
public function update(Request $request, Book $book) { $request->validate([ 'ISBN' => 'required', 'publisher_id' => 'required', 'author_id' => 'required', 'year' => 'required', 'title' => 'required', 'price' => 'required', ]); try { $book->update($request->all()); // 同步仓库关联,空数组默认值用于处理用户全不勾选的场景 $book->warehouses()->sync($request->checked ?? []); return redirect()->route('books.index') ->with('success','Book updated successfully.'); } catch (\Illuminate\Database\QueryException $e) { var_dump($e->errorInfo); } }
额外优化建议
你原有store方法中的循环attach逻辑也可以替换为sync方法,代码更简洁:
// 替换原有foreach循环 $book->warehouses()->sync($request->checked ?? []);
内容的提问来源于stack exchange,提问作者Xelerate
相关产品推荐
相关产品推荐

