Laravel Eloquent Query适用于控制器,但Blade也失败了

时间:2018-02-24 20:39:46

标签: laravel object eloquent blade belongs-to

有两种型号,

用户

id,姓名,电子邮件等

注释

id,user_id,comment等

Comment Model


public function user()
    {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }

当我使用以下查询尝试控制器时,我可以获取用户的电子邮件地址

$comments = Comment::where('status',1)->orderBy('id', 'desc')->take(5)->get();
foreach ($comments  as $comment){

    return $comment->user->email;
}

但是,我没有成功,当我将以下内容写入Blade文件时出现错误。

@foreach($comments as  $comment)

                                <a href="{{ $comment->user->email }}">
                                    <img class="avatar" src="{{ $comment->user->photo }}"
                                         data-at2x="{{ $comment->user->photo }}"
                                         alt="{{ $comment->user->slug}}">
                                </a>

                        @endforeach
  

错误消息:尝试获取非对象的属性

我在等你的帮助,先谢谢。

4 个答案:

答案 0 :(得分:0)

在评论模型中添加with字段

class Comment extends Model
{
    protected $with = [
        'user'
    ];
    protected $fillable = [
       ....
    ];

    public function user (){
      return $this->belongsTo('App\User'  ,'user_id' ,'id' );
    }
}

答案 1 :(得分:0)

你可以使用Lazy Eager with

来做到这一点
$comments = Comment::with('user')->where('status',1)->orderBy('id', 'desc')->take(5)->get();
 return view('YourViewPath/ViewFileName.blade.php',compact('comments'));

现在在您看来:

@foreach($comments as  $comment)

       <a href="{{ $comment->user->email }}">
            <img class="avatar" src="{{ $comment->user->photo }}"
                 data-at2x="{{ $comment->user->photo }}"
                 alt="{{ $comment->user->slug}}">
       </a>
@endforeach

答案 2 :(得分:0)

尝试使用条件。

@foreach($comments as  $comment)
    <a href="{{ $comment->user->email?$comment->user->email:'' }}">
       <img class="avatar" 
           src="{{ $comment->user->photo?$comment->user->photo }}" 
           data-at2x="{{ $comment->user->photo }}"
           alt="{{ $comment->user->slug?$comment->user->slug:''}}">
    </a>
@endforeach

答案 3 :(得分:0)

我找到了你沮丧的原因。更确切地说,在http://forum.laravel.gen.tr/viewtopic.php?pid=12477#p12477 @mgsmus回复了我的朋友。

简单地说,我需要解释一下;某些评论者不在用户表中。

建议2种预防方法。 第一; 如果您获得非对象错误的try-to-get属性,则其中一个注释没有与任何User模型关联的记录,即其中一个为null。 在这种情况下,您可以使用optional()辅助函数。 (Laravel在5.5和5.6中可用,但也可以很容易地传递到5.4。)optional()辅助函数允许属性在对象为空时返回null,而不是错误,而不是非对象错误。 https://laravel.com/docs/5.6/helpers#method-optional

所以而不是$ comment-&gt;用户&GT;在刀片中输入电子邮件,输入可选($ comment-&gt; user) - &gt;电子邮件。其他是可选的($ comment-&gt; news) - &gt;链接和可选(可选($ comment-&gt;考试) - &gt;链接,这样您就可以看到哪条记录没有链接。

另一种方法是仅保留仅具有关联的记录: https://laravel.com/docs/5.6/eloquent-relationships(查询关系存在部分)

//有('user')确保我们对用户有5条评论。 //这与whereNotNull('user_id')不同,因为它会检查模型是否确实存在。 user_id可能已满,但我们不知道它是具有id的用户。

Comment :: has ('user') -> where ('check', 1) -> orderBy ('id', 'desc') -> take (5) -> get ();