【问题标题】:Laravel 5.5 - Trying to get property of non-objectLaravel 5.5 - 试图获取非对象的属性
【发布时间】:2018-06-06 00:13:52
【问题描述】:

我正在尝试更新我的数据,但我不断收到以下错误消息: “试图获取非对象的属性(查看:C:\xampp\htdocs\blog\resources\views\update.blade.php)”。

这是我的 update.blade.php 文件

@extends ('layout')

@section ('title')

Update page

@stop

@section ('content')

<div class="row">

    <div class="col-lg-12">

        <form action="/todo/save" method="post">

            {{ csrf_field() }}

            <input type="text" class="form-control input-lg" name="todo" 
value="{{ $todo->todo }}" placeholder="Type in to create a new todo">

        </form>

    </div>

</div>

<hr>

@foreach ($todo as $todo)

    {{ $todo->todo }} <a href="{{ route('todo.update', ['id' =>$todo->id]) 
}}" class="btn btn-info btn-sm">Update</a> <a href="{{ route('todo.delete', 
['id' =>$todo->id]) }}"class="btn btn-danger">Delete</a>

    <hr>

@endforeach 

@stop

我的控制器:

public function update($id){

    //dd($id);

    $todo = Todo::find($id);

    return view('update')->with('todo', $todo);  
}

最后是我的更新路线:

Route::get('/todo/update/{id}', 'TodosController@update')-
>name('todo.update');

这只是一些基本的东西,但我现在在这里停留了几个小时,非常感谢任何帮助!

【问题讨论】:

  • 如果您添加有关错误的更多详细信息(例如导致此错误的行号)会有所帮助。我从来没有尝试过这样的事情,但我猜foreach ($todo as $todo) 可能会导致一些问题,因为你的两个变量都被命名为$todo
  • 我已经尝试重命名它,但没有成功。这是导致错误消息的代码部分(我之前没有提到它是不好的): todo); ?> 更新 删除 todo.delete、todo.update和id报错。

标签: php laravel routes


【解决方案1】:

如果 $todo 为空,请在控制器上使用 findOrFail 方法抛出异常

public function update($id){

    $todo = Todo::findOrFail($id);

    return view('update', compact('todo'));  
}

您的update.blade.php 文件也存在问题。 foreach $todo as todo, $todo 收藏了雄辩模型还是雄辩模型?我认为这是一个雄辩的模型。所以循环没有任何意义。

【讨论】:

  • 在我看来这是一些与路线相关的问题。
  • 它总是给我同样烦人的错误信息。
【解决方案2】:

如果todo 为 FALSE 或其他一些非对象,则会发生该错误。

您可以在控制器中使用var_dump($todo);die(); 对其进行检查。

【讨论】:

  • 我得到确认 todo 是一个对象。
  • 一旦您调用foreach ($todo as $todo),您就会用它的第一个属性覆盖该对象,正如我看到其他人告诉您的那样。该循环在第一次迭代时破坏了您的变量。
【解决方案3】:

find() 将返回 null 或找到的模型。假设找到了模型,您将在该模型 (foreach ($todo...)) 上为每个模型执行一次,这将遍历模型的公共属性。这显然不是你打算做的。

在我看来,您正在尝试遍历待办事项列表并打印出编辑/删除链接。如果是这种情况,您需要在控制器中获取待办事项列表,将其传递到您的视图中,并修复您的 foreach 语句。

控制器:

$todos = Todo::get();
// pass to view

查看:

foreach ($todos as $todo) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 2018-03-03
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多