Laravel图书编辑更新异常:点击更新却新增记录的解决求助
问题原因及修复方案
1. Update方法核心错误:覆盖查询到的模型实例
你的update方法中,先通过Book::find($book_id)获取了待更新的图书模型,但紧接着用$books = new Book;创建新实例覆盖了原有对象,导致后续save()实际是保存新数据,自然变成新增记录。
修复后的update方法:
public function update(Request $request,$book_id) { // 用findOrFail更安全,找不到对应记录直接返回404 $books = Book::findOrFail($book_id); // 直接为查询到的模型赋值 $books->name = $request->name; $books->title = $request->title; $books->comments = $request->comments; // 此时save()会执行更新操作(模型已有主键值) $books->save(); return redirect()->route('home.books')->with('message','修正しました'); }
更简洁的批量赋值写法(需在Book模型设置$fillable白名单):
public function update(Request $request,$book_id) { $books = Book::findOrFail($book_id); $books->update($request->only(['name', 'title', 'comments'])); return redirect()->route('home.books')->with('message','修正しました'); }
注意:使用批量赋值时,必须在Book模型中添加:protected $fillable = ['name', 'title', 'comments'];
2. Edit方法错误:覆盖单条图书数据
edit方法中,先查询单条图书数据后,立刻用Book::pluck('name','name')将变量替换为所有图书名称的集合,导致视图无法获取待编辑的单条图书信息,表单无法填充原有数据。
修复后的edit方法:
public function edit($book_id) { $book = Book::findOrFail($book_id); // 单条数据用单数变量名更清晰 $allBooks = Book::pluck('name','name'); // 若需所有图书选项,单独存储 return view('front.book.edit',[ 'book' => $book, 'allBooks' => $allBooks ]); }
3. 表单路由参数错误
表单路由参数传递了字符串'book_id',而非实际的图书ID变量,导致请求无法匹配到对应图书。
修复后的表单代码:
{!! Form::open(['route' => ['book.update', $book->id], 'method' => 'post']) !!} {{ method_field('put') }} <!-- 利用edit方法传递的$book变量填充表单原有数据 --> {!! Form::text('name', $book->name) !!} {!! Form::text('title', $book->title) !!} {!! Form::textarea('comments', $book->comments) !!} {!! Form::submit('更新') !!} {!! Form::close() !!}
额外注意事项
- 若
Book模型主键并非默认的id,需在模型中设置:protected $primaryKey = '你的主键字段名'; - 可添加请求验证提升健壮性,例如在update方法开头加入:
$request->validate([ 'name' => 'required', 'title' => 'required', // 按需添加其他字段验证规则 ]);
内容的提问来源于stack exchange,提问作者reiky
相关产品推荐
相关产品推荐

