试图获取非对象Laravel 6的属性“描述”

时间:2019-12-22 13:50:14

标签: php laravel laravel-6

我是Laravel的新手,目前正在尝试制作Todos应用程序。但是,当我尝试读取模型并将其显示在Blade文件中时,会出现此错误:

  

“试图获取非对象的属性'描述'

web.php

Route::get('/{todo}', 'TodosController@show');

TodosController.php

public function show($todoId){
    $todos = Todo::find($todoId);

    return view('todos.show', compact('todos'));
}

show.blade.php

 @foreach ($todos as $todo)
     <li class="list-group-item">
         {{ $todo->description }}
     </li>
 @endforeach

错误在{{ $todo->description }}

我曾见过类似的问题,但我不明白,因此请帮助我。我想知道为什么会发生此错误,我该如何解决?

4 个答案:

答案 0 :(得分:1)

$todos = Todo::find($todoId);

将为您提供Todo的单个实例。在您看来,您正在遍历期待Todos

的数组或集合

您可以在视图中删除foreach循环,也可以将Todo查询更改为:

$todos = Todo::where('id', $todoId)->get()

这将为您提供包裹在集合中的单个Todo,从而使您的循环可以获取集合中的单个Todo实例。

问题在于,当您将模型的实例传递给循环时,它将开始遍历属性。然后,您尝试将该属性获取到另一个不存在的属性上。 您需要将数组或集合传递给循环,以便每个项目都是具有有效属性的实例。

进行转储以查看可用于获取数据的方法的结果可能会有所帮助

dump(
    Todo::all(),
    Todo::where('id', $todoId)->get(),
    Todo::find($todoId)
);

您将看到前两个return集合,这些集合在传递到foreach时会起作用。 第二个返回Todo的实例,该实例可以传递到循环中,但是如果实例形成集合,则循环将从实例中提取属性。您想要后者。

答案 1 :(得分:0)

尝试一下

public function show($todoId){
        $todos = Todo::where('id', $todoId)->get();
        return view('todos.show', compact('todos'));
    }

答案 2 :(得分:0)

TodosController.php

    public function show($todoId){
    $todos = Todo::find($todoId)->get()->first();
    return view('todos.show', compact('todos'));
}

show.blade.php

    <li class="list-group-item">
       {{ $todos['description'] }}
    </li>
  

无需使用foreach循环

答案 3 :(得分:0)

您的代码是正确的,但还要添加一个模型名称,例如

public function show(Todo $todoId){
    $todos = Todo::find($todoId);

    return view('todos.show', compact('todos'));
}

这是在同一控制器上使用的laravel默认值