Laravel多对多关联下新建书籍时绑定复选框选中仓库的问题
解决方案
核心问题在于Book::create()方法执行成功后会直接返回新创建的Book模型实例,不需要额外通过查询获取,你当前写法用Book::first()永远拿到的是书籍表中ID最小的第一条记录,所以关联关系永远绑定到ID为1的书籍上。
具体修改步骤
- 直接接收
Book::create()的返回值作为当前新书实例 - 无需循环调用attach方法,直接把选中的仓库ID数组传给attach即可,同时增加非空判断,避免用户未选任何仓库时抛出错误
- 可选优化:删除create方法中无效的
$selectedWarehouse = Book::first()->warehouse_id;代码,Book模型本身不存在warehouse_id字段,该代码无实际作用还可能引发报错
修改后的store方法完整代码
public function store(Request $request) { $request->validate([ 'ISBN' => 'required', 'author_id' => 'required', 'publisher_id' => 'required', 'year' => 'required', 'title' => 'required', 'price' => 'required', ]); try { // 直接接收create方法返回的新书籍实例 $book = Book::create($request->all()); // 只有用户选中了仓库时才执行关联绑定 if ($request->has('checked')) { $book->warehouses()->attach($request->checked); } return redirect()->route('books.index') ->with('success','Book created successfully.'); } catch (\Illuminate\Database\QueryException $e) { var_dump($e->errorInfo); } }
内容的提问来源于stack exchange,提问作者Xelerate
相关产品推荐
相关产品推荐

