Laravel编辑更新功能报错:集合实例不存在[id]属性
Laravel编辑更新功能报错排查与修复
错误原因分析
你遇到的「Property [id] does not exist on this collection instance.」错误,核心问题出在控制器的edit方法里变量被错误覆盖:
- 先用
$books = Book::find($book_id);获取了单条图书模型实例 - 紧接着又执行
$books = Book::pluck('name','name');,把$books重新赋值为一个集合(所有图书的name键值对) - 视图里调用
$books->id时,集合没有id属性,自然报错
另外你的update方法也存在逻辑错误,会导致无法正确更新数据。
修复步骤
1. 修正edit方法
如果页面需要显示当前编辑图书的信息,同时还要下拉选择其他图书名称,要把两个数据用不同变量名区分,不要覆盖:
public function edit($book_id) { // 获取当前要编辑的单条图书数据,findOrFail找不到时直接抛出404 $book = Book::findOrFail($book_id); // 获取所有图书名称作为下拉选项,用单独变量存储 $bookOptions = Book::pluck('name', 'id'); return view('front.book.edit', compact('book', 'bookOptions')); }
对应的视图表单要修改为使用$book->id:
{!! Form::open(['route' => ['book.update','book_id'=>$book->id], 'method' => 'put']) !!}
2. 修正update方法
原代码里找到图书实例后,又新建了Book对象,这会导致你是在创建新记录而不是更新原有记录,而且新建的实例没有主键,调用update()会失败。正确写法如下:
public function update(Request $request, $book_id) { // 找到要更新的图书实例 $book = Book::findOrFail($book_id); // 直接给找到的模型赋值 $book->name = $request->name; $book->title = $request->title; $book->comments = $request->comments; // 保存修改 $book->save(); return redirect()->route('home.books')->with('message','已修改完成'); }
或者更简洁的批量赋值写法:
public function update(Request $request, $book_id) { Book::findOrFail($book_id)->update([ 'name' => $request->name, 'title' => $request->title, 'comments' => $request->comments ]); return redirect()->route('home.books')->with('message','已修改完成'); }
内容的提问来源于stack exchange,提问作者reiky
相关产品推荐
相关产品推荐

