在迭代结果时尝试获取非对象的属性

11 浏览
0 Comments

在迭代结果时尝试获取非对象的属性

我试图通过传递(index blade)页面的id来显示提供表的数据,但是当我打开(details blade)时出现以下错误:

试图获取非对象的属性“title”

(details blade)页面(错误显示在此页面上):

    @foreach($details as $detail)
            
{{$detail->title}}

{{$detail->description}}

{{$detail->price}} Angular logo 购买产品 @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

或任何对象

0
0 Comments

问题的原因是在视图中尝试迭代一个单个模型实例,而不是一个结果集合。解决方法是删除视图中的迭代部分,或者在控制器中将变量名更改为$detail。

根据文档,findOrFail方法将检索查询的第一个结果,而不是结果集合。因此,$details是一个单个模型实例。通过检查$details,可以看到它是一个单个模型,而不是一个集合。

视图中的迭代部分尝试迭代这个单个模型。由于$details是一个单个模型实例,这将尝试迭代其属性,导致出错。

如果只向视图传递了一个单个模型,只需删除迭代部分来显示它。在控制器中将变量名更改为$detail也是有意义的,因为它是单数形式。

此外,有一些评论和回答说变量名和对象操作符之间的空格是错误的,导致了错误。实际上,空格也可以正常工作,尽管它非常不寻常,并且被认为是编码风格不佳。

如果将$details定义为数组$details[],那么问题将得到解决。

解决此问题的方法包括删除视图中的迭代部分或将变量名更改为$detail,并确保正确处理模型实例或结果集合。

0