Laravel 5.8 Edit/Update功能报错:Property [id]不存在于集合实例
嘿,我来帮你排查这个Laravel 5.8的错误问题!你遇到的Property [id] does not exist on this collection instance错误,核心原因是视图里的$Stock变量是一个**集合(Collection)**而非单个的Stock模型实例,所以没法直接访问->id这类模型属性。咱们一步步拆解问题并解决:
问题根源在哪里?
看你的editStock控制器方法:
public function editStock(Stock $id) { // $Stock = Stock::find($id); return view('Stock.edit', compact('Stock', 'id')); }
- 你注释了获取单个模型的代码,虽然用了路由模型绑定(
Stock $id),但这个$id已经是对应ID的Stock模型实例了,可你没把它赋值给$Stock变量,反而直接compact('Stock')——此时$Stock根本没定义,导致传到视图的变量要么是空集合,要么未初始化,最终触发了集合访问属性的错误。 - 另外你的更新路由用了
POST方法,不符合Laravel的RESTful规范,更新资源应该用PUT/PATCH,不然可能引发路由匹配问题。 - 视图里的input
value没加双引号,要是值里有空格,渲染会出问题;下拉框的选中状态也没正确处理。
一步步解决问题
1. 修复editStock控制器方法
两种方式选一个就行:
方式一:利用路由模型绑定(推荐)
既然路由模型绑定已经把对应ID的Stock实例注入到$id里,直接把它赋值给$Stock就行:
public function editStock(Stock $id) { $Stock = $id; // 把路由模型绑定的实例赋值给视图要用的变量 return view('Stock.edit', compact('Stock')); }
或者更规范的命名(把方法参数改成$stock,再转成$Stock):
public function editStock(Stock $stock) { $Stock = $stock; return view('Stock.edit', compact('Stock')); }
方式二:手动查找模型(不用路由模型绑定)
如果不想用路由模型绑定,取消类型提示,手动用findOrFail获取模型(找不到会返回404,比find更安全):
public function editStock($id) { $Stock = Stock::findOrFail($id); return view('Stock.edit', compact('Stock')); }
2. 修正更新路由的HTTP方法
Laravel里更新资源要用PUT或PATCH,修改路由:
// 把post改成put Route::put('/Stock/edit/{id}', 'ChicController@updateStock')->name('updateStock');
3. 修复视图的表单和字段
- 表单要加
@method('PUT')来模拟PUT请求(HTML表单只支持GET/POST); - 所有input的
value加双引号,避免空格渲染错误; - 下拉框的选中状态要通过条件判断设置
selected属性:
<form method="post" action="{{ route('updateStock', $Stock->id) }}"> {{ csrf_field() }} @method('PUT') <!-- 新增这行,模拟PUT请求 --> <div class="form-group"> <label for="stock_name">Stock Name:</label> <input type="text" class="form-control" name="stock_name" value="{{ $Stock->stock_name }}" /> </div> <div class="form-group"> <label for="stock_qty">Stock Amount:</label> <input type="number" class="form-control" name="stock_qty" value="{{ $Stock->stock_qty }}" /> </div> <div class="form-group"> <label for="stock_unit">Stock Unit:</label> <select id="stock_unit" name="stock_unit"> <option value="Kg" {{ $Stock->stock_unit == 'Kg' ? 'selected' : '' }}>Kg</option> <option value="Qty" {{ $Stock->stock_unit == 'Qty' ? 'selected' : '' }}>Qty</option> </select> </div> <div class="form-group"> <label for="stock_price_per_kg">Price Per Kg:</label> <input type="number" class="form-control" name="stock_price_per_kg" value="{{ $Stock->stock_price_per_kg }}" /> </div> <div class="form-group"> <label for="stock_weight_per_qty">Weight Per Qty:</label> <input type="number" class="form-control" name="stock_weight_per_qty" value="{{ $Stock->stock_weight_per_qty }}" /> </div> <button type="submit" class="btn btn-primary">Update</button> </form>
4. 可选优化:简化updateStock方法
可以用update()批量赋值,让代码更简洁(记得给Stock模型加$fillable属性):
public function updateStock(Request $request, $id) { $request->validate([ 'stock_name'=>'required', 'stock_qty'=>'required', 'stock_unit'=>'required', 'stock_price_per_kg'=>'required', 'stock_weight_per_qty'=>'required' ]); $stock = Stock::findOrFail($id); // 批量赋值,需要Stock模型设置$fillable $stock->update($request->only([ 'stock_name', 'stock_qty', 'stock_unit', 'stock_price_per_kg', 'stock_weight_per_qty' ])); return redirect('/Stock/index/')->with('success', 'Stock updated!'); }
然后在App\Stock模型里添加$fillable:
class Stock extends Model { protected $fillable = [ 'stock_name', 'stock_qty', 'stock_unit', 'stock_price_per_kg', 'stock_weight_per_qty' ]; }
最后验证
做完这些修改后,访问编辑页面应该能正常加载对应Stock的数据,提交表单也能成功更新,不会再出现集合属性不存在的错误啦!
内容的提问来源于stack exchange,提问作者Kamarul Adha
相关产品推荐
相关产品推荐

