尝试获取 属性 'description' 的非对象 Laravel 6

Trying to get property 'description' of non-object Laravel 6

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

"Trying to get property 'description' of non-object"

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 }}

我看到过类似的问题,但是我看不懂所以请帮助我。我想知道为什么会出现这个错误,我该如何解决?

$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 时起作用。 第二个 return 是 Todo 的一个实例,它可以传递给您的循环,但如果实例形成集合,则循环然后从实例中提取属性。你想要后者。

试试这个

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

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>

no need to use foreach loop

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

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

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

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