【问题标题】:Trying to get property of non-object when iterating results [closed]迭代结果时尝试获取非对象的属性[关闭]
【发布时间】:2023-03-18 15:19:01
【问题描述】:

我试图通过传递(索引刀片)页面的 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

或任何物体

【问题讨论】:

标签: php laravel object


【解决方案1】:

From the docs:

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>

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

【讨论】:

  • @foreach 工作,如果我这样(细节): $details[] 现在我明白了为什么
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多