在迭代结果时尝试获取非对象的属性
在迭代结果时尝试获取非对象的属性
我试图通过传递(index blade)页面的id来显示提供表的数据,但是当我打开(details blade)时出现以下错误:
试图获取非对象的属性“title”
(details blade)页面(错误显示在此页面上):
@foreach($details as $detail){{$detail->title}}
{{$detail->description}}
{{$detail->price}} 购买产品 @endforeach
(index blade)页面:
@if(isset($offers) && $offers->count() > 0) @foreach($offers as $offer){{$offer->title}}
{{$offer->contnet}} 详情 @endforeach @endisset
路由:
Route::get('/test_object', 'testController@test_object')->name('test_object'); Route::get('/object/{id}', 'testController@object')->name('test_object.details');
控制器:
public function test_object() { $offers = Offer::get(); return view('front.indext', compact('offers')); } public function object($id) { $details = Offer::findOrFail($id); return view('front.detailst', compact('details')); }
当我返回时:
return $details = Offer::findOrFail($id);
它显示以下JSON:
{
"id": 1,
"title": "三星Galaxy S21",
"description": "Zoom X100",
"price": 20000
}
所以,在(details blade)中应该像这样工作:
$details->title
或任何对象
问题的原因是在视图中尝试迭代一个单个模型实例,而不是一个结果集合。解决方法是删除视图中的迭代部分,或者在控制器中将变量名更改为$detail。
根据文档,findOrFail方法将检索查询的第一个结果,而不是结果集合。因此,$details是一个单个模型实例。通过检查$details,可以看到它是一个单个模型,而不是一个集合。
视图中的迭代部分尝试迭代这个单个模型。由于$details是一个单个模型实例,这将尝试迭代其属性,导致出错。
如果只向视图传递了一个单个模型,只需删除迭代部分来显示它。在控制器中将变量名更改为$detail也是有意义的,因为它是单数形式。
此外,有一些评论和回答说变量名和对象操作符之间的空格是错误的,导致了错误。实际上,空格也可以正常工作,尽管它非常不寻常,并且被认为是编码风格不佳。
如果将$details定义为数组$details[],那么问题将得到解决。
解决此问题的方法包括删除视图中的迭代部分或将变量名更改为$detail,并确保正确处理模型实例或结果集合。