【问题标题】:Trying to get property 'description' of non-object Laravel 6试图获取非对象 Laravel 6 的属性“描述”
【发布时间】:2019-12-22 13:50:14
【问题描述】:

我是 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-&gt;description }}

我看到过类似的问题,但我无法理解,因此请帮助我。我想知道为什么会出现这个错误,我该如何解决?

【问题讨论】:

  • 你想在 foreach 中获取 $todos 的列表吗?

标签: php laravel laravel-6


【解决方案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)
);

当您传递给您的 foreach 时,您会看到前两个返回集合起作用。 第二个返回 Todo 的实例,它可以传递给您的循环,但如果实例形成集合,则循环然后从实例中提取属性。你想要后者。

【讨论】:

  • 谢谢!它现在正在工作。我已经为名称做了同样的事情,但它为什么不能用于描述?
  • 我需要看看你为名字做了什么。我怀疑您没有遍历项目以显示名称,因此您没有尝试访问实例第一个属性上的 name 属性
  • TodosController.php public function index(){ $todos = Todo::all(); return view('todos.index',compact('todos')); } show.blade.php @foreach ($todos as $todo) &lt;li class="list-group-item"&gt; {{ $todo-&gt;name }} &lt;/li&gt; @endforeach
  • 好的,你在这个例子中调用了Todo::all(),它返回了一个Todos的集合,所以当你把它传递给循环时,循环中的每个项目都有属性。在您的 OP 中,您只有一个 Todo 实例,您将其传递给循环
  • 转储Todo::all()Todo::where('id', $todoId)-&gt;get()Todo::find($todoId) 的结果可能会有所帮助,这样您就可以看到数据返回方式的差异
【解决方案2】:

试试这个

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

【讨论】:

  • 成功了!谢谢!但是,我仍然无法弄清楚为什么会发生错误。你能告诉我吗?
  • you get id = Your find id not directly so
  • 如果对您有帮助,请选择此答案谢谢并放弃投票谢谢。
  • 我已经做到了。但是由于我在 stackoverflow 中的声誉较低,因此它不会显示在我的身上。它可能已经显示在您的身上。
  • 好的,你能不能给这个答案投票谢谢..如果你能..
【解决方案3】:

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 循环

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 2020-03-03
      • 2020-05-04
      • 2015-09-22
      • 2017-03-20
      • 2014-03-25
      • 2015-01-25
      • 2014-06-23
      相关资源
      最近更新 更多