我是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 }}
我曾见过类似的问题,但我不明白,因此请帮助我。我想知道为什么会发生此错误,我该如何解决?
答案 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)
public function show($todoId){
$todos = Todo::find($todoId)->get()->first();
return view('todos.show', compact('todos'));
}
<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默认值