首页 > 解决方案 > 迭代结果时尝试获取非对象的属性

问题描述

我试图通过传递(索引刀片)页面的 id 来显示报价表的数据,但是当我打开(详细信息刀片)时会显示此错误:

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

(详细信息刀片)页面(此页面中显示错误):

<div class="container row d-flex justify-content-center">
<div class="col-md-4 mb-4 float-left">

    @foreach($details as $detail)

    <div class="card">
        <div class="card-body text-center">
            <h5 class="mt-0 mb-1 mb-2">{{$detail-> title}}</h5>
            <p class="grey-text mb-2" >{{$detail-> description}}</p>
            <p class="grey-text mb-2" id="price" >{{$detail-> price}}</p>
            <img
                src="https://www.91-img.com/pictures/133432-v4-xiaomi-mi-a3-mobile-phone-large-1.jpg?tr=q-60"
                class="my-3" alt="Angular logo">
            <br>
            <br>

            <a id="checkout" href="{{route('offers.checkout', $detail -> price )}}"
               role="button" class="btn  btn-success px-3 waves-effect waves-light"> شراء المنتج
            </a>
        </div>

    </div>
        @endforeach

(索引刀片)页面:

 <div class="container">
    <div class="d-flex justify-content-center">

        @if(isset($offers) && $offers -> count()> 0)
            @foreach($offers as $offer)
                <div class="col-md-4 mb-4">
        <div class="card">
            <div class="card-body text-center">
                <h4>{{$offer -> title}}</h4>
                <p>{{$offer -> contnet}}</p>

                <img src="https://www.91-img.com/pictures/133432-v4-xiaomi-mi-a3-mobile-phone-large-1.jpg?tr=q-60">
                <br> <br>
                <a id="home-updates-angular" href="{{route('test_object.details', $offer -> id)}}" role="button" class="btn btn-success px-3 waves-effect waves-light">التفاصيل</a>
            </div>
        </div>
                </div>

            @endforeach
        @endisset


    </div>

</div>

路线:

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": "Samsung Galaxy S21",
"description": "Zoom X100",
"price": 20000
}

所以,它应该像这样在(细节刀片)中工作:

$details -> title

或任何物体

标签: phplaravelobject

解决方案


从文档

findOrFail .. 方法将检索查询的第一个结果;

注意“第一个结果” - 不是结果集合,而是一个结果。所以$details这是一个单一的模型实例(如果找到的话):

$details = Offer::findOrFail($id);

您已经通过检查自己验证了这一点$details,您可以看到它是一个模型,而不是一个集合:

{
"id": 1,
...
}

一个模型的集合看起来像这样:

[{
"id": 1,
...
}]

但是视图试图迭代那个单一的模型:

@foreach($details as $detail)

由于$details是单个模型实例,这将尝试迭代其属性,这将失败。

如果您只是将一个模型传递给您的视图,只需删除@foreach迭代以显示它。将控制器中的变量名称更改$detail为单数也很有意义。

<div class="container row d-flex justify-content-center">
    <div class="col-md-4 mb-4 float-left">
        <div class="card">
            <div class="card-body text-center">
                <h5 class="mt-0 mb-1 mb-2">{{ $detail->title }}</h5>

旁注:这里有很多评论和答案说您的变量名和对象运算符之间的空格->是错误的并导致错误。事实上,空间工作得很好(令人惊讶,至少对我来说),虽然你可以从评论的数量中看出它是非常不寻常的,而且我预计会被认为是糟糕的编码风格。


推荐阅读