尝试使用雄辩关系时尝试获取非对象错误的属性

时间:2015-01-13 13:54:48

标签: php mysql database laravel eloquent

错误如下:

Trying to get property of non-object (View: C:\xampp\htdocs\laravel\app\views\singlePost.blade.php)

有2个表:评论和用户。在comments表中有一个名为user_id的列,它引用users表中的id列。用户表中有用户名列。这就是我尝试打印用户名的方式。

@foreach($theComments as $theComment)
<div>{{$theComment->users->username}}</div>
<div style="border:1px solid black;margin:8px 0px 8px 0px">{{$theComment['content']}}</div>
@endforeach

和控制器:

 public function singlePost(Posts $post)
    {
        $id = $post['id'];
        $comments = Comments::where('post_id','=',$id)->get();
        $users = Users::all();
        return View::make('singlePost')->with('thePost', $post)->with('theComments', $comments)->with('theUser', $users);
    }

和/Model/Comments.php

<?php
class Comments extends Eloquent{
    protected $fillable = array('user_id');
    public function users(){
        return $this->belongsTo('Users');
    }
}

问题是什么,我该如何解决?

2 个答案:

答案 0 :(得分:0)

首先我建议您将关系重命名为user()(一开始以为它会返回一个集合)。错误的来源可能是没有用户分配的注释。

最好的方法就是从查询中排除这些内容。您可以has()使用

$comments = Comments::has('user')->where('post_id','=',$id)->get();

您还应急切加载用户关系,否则您会遇到n + 1个查询问题:

$comments = Comments::has('user')->with('user')->where('post_id','=',$id)->get();

修改

尝试在视图中包装它:

@foreach($theComments as $theComment)
    @if($user = $theComment->users)
        <div>{{$user->username}}</div>
    @endif
@endforeach

答案 1 :(得分:-1)

您需要先加载关系

$comments = Comments::with('users')->where('post_id','=',$id)->get();

请参阅http://laravel.com/docs/4.2/eloquent#eager-loading