【问题标题】:Trying to get property of non-object in controller试图在控制器中获取非对象的属性
【发布时间】:2014-08-13 13:44:50
【问题描述】:

这是我的控制器

public function show($restaurant_id)
{
    $data = Restaurant::find($restaurant_id)->waitingtimes();
    echo $data->first()->value; exit;

虽然waitingtime 模型映射到具有value 列的数据库表,但我得到了Trying to get property of non-object

你能帮忙吗?另外,你能告诉我在哪里可以阅读关于函数返回类型的文档find() 谢谢

编辑 1

数据不为空;我可以看到数据库,restaurant 表的 id 为 20,表 waitingtimes 的值是其restaurant_20 为 20

【问题讨论】:

  • find的文档可以在here找到
  • 您需要使用 Route::bind() 这将允许您捕获未从路由中获取结果的实例,并执行 ie if(!$user) return App::abort(404); 以返回 404 错误而不是错误你得到...
  • @JustinE 我现在需要打印 $data 变量,稍后我将处理用户的错误输入:)

标签: php laravel laravel-4 blade


【解决方案1】:

最后我自己找到了解决办法,就是:

public function show($restaurant_id)
{
    $data = new Restaurant(array('id' => $restaurant_id));
    $data = $data->waitingtimes();
    echo $data->first()->value; exit;

【讨论】:

    【解决方案2】:

    这里是 find() 的来源 https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php#L643

    这里有文档

    http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_find

    对于您的非对象错误,

    你的 $data 是空的,你应该在使用 $data 集合之前检查一下

    【讨论】:

    • 数据肯定不是空的,我可以在我的数据库中看到它。如果您愿意,请告诉我任何测试数据并打印输出的语句。
    【解决方案3】:

    实际上 - 最好将路线映射到模型。

    所以在你的 Routes.php 文件中:

    Route::model('restaurant', 'Restaurant');
    
    Route::get('/restaurant/{restaurant}', ['as' => 'restaurant.show', 'uses' => RestaurantController@show]);
    

    然后在你的控制器文件中:

    public function show(Restaurant $restaurant)
    {
        echo $restaurant->waitingtimes()->first()->value;
    }
    

    你可以阅读更多关于Route Model Binding here的信息。

    【讨论】:

    • 你为什么认为我没有将模型路由到路由? :) 我已经这样做了,这与我的问题无关。换句话说,虽然地图存在,但问题出现了
    • 您需要使用 Route::bind() 这将允许您捕获未从路由中获取结果的实例,并执行 ie if(!$user) return App::abort(404); 以返回 404 错误而不是错误你得到...
    • 另外,@AnastasieLaurent 您没有在问题中指定。
    • 还有@AnastasieLaurent 如果您使用的是Route Model Binding,您的代码应该是:echo $restaurant_id->waitingtimes()->first()->value; exit;,因为$restaurant_id 将是您餐厅类的一个实例。
    • @AnastasieLaurent 我假设您没有使用路由模型绑定,因为您没有在控制器中正确使用它。看看我的控制器显示功能。它与你的不同。您需要指定 (Restaurant $restaurant)。然后你就不需要“找到”餐厅了——Laravel 给了你。
    猜你喜欢
    • 2019-03-13
    • 2019-06-30
    • 2018-12-16
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多