Laravel8报错Property [Eng2] does not exist on this collection instance问题咨询
问题原因
- 控制器
detail方法中使用get()执行查询,该方法返回的是Eloquent集合对象(相当于包含多个匹配结果的模型数组),而非单个Wine模型实例。 - 直接输出
{{$wine}}时Laravel会自动将集合序列化为JSON字符串,因此能看到完整数据,但集合本身不存在Eng2属性,直接调用属性或数组下标读取字段就会报错。 - 列表页运行正常是因为列表场景下会对集合做循环遍历,每次读取的是集合内的单个模型实例,因此可以正常读取字段。
解决方法
修改控制器的查询逻辑,将get()替换为first()或firstOrFail(),直接获取单条匹配记录:
public function detail($id) { // first()返回匹配条件的第一条单条模型实例 $wine = Wine::where('ART','=',$id)->first(); // 更推荐使用firstOrFail(),未匹配到数据时自动抛出404异常,避免后续逻辑异常 // $wine = Wine::where('ART','=',$id)->firstOrFail(); return view('detail', [ 'wine' => $wine ]); }
修改完成后,模板中原有的{{$wine->Eng2}}写法即可正常读取对应字段值。
临时兼容方案(不推荐):如果不修改控制器,也可以在模板中读取集合的第一个元素取值:
{{$wine[0]->Eng2}},但不符合详情页单条查询的逻辑规范,不建议使用。
内容的提问来源于stack exchange,提问作者Jean-Yves Romagnani
相关产品推荐
相关产品推荐

