首页 > 解决方案 > 抛出 ErrorException 并显示消息“尝试获取非对象的属性‘用户’

问题描述

我在我的 laravel 项目中使用关系。我正在尝试展示我的帖子和回复。但我不断收到这个错误。我尝试了各种解决方案,但都没有奏效。谁能帮我?

岗位型号:

protected $fillable = [
                'title', 'content', 'category_id' , 'slug', 'user_id',
            ];
public function user1()
        {
                return $this->belongsTo('App\User');
        }
public function replies()
        {
                return $this->hasMany('App\Reply');
        }

回复型号:

  protected $fillable = ['content','user_id','posts_id'];


    public function post(){
        return $this->belongsTo('App\Post');
    }

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

后控制器:

public function shro($slug)
    {
        $pst= Post::where('slug',$slug)->first();
        return view('posts.show')->with('p', $pst);
    }

show.blade.php

<div class="panel panel-default">
    <div class="panel-heading">

    <img src="/uploads/avatars/{{ $p->user->avatar }}" alt="" width="70px" height="60px">&nbsp;&nbsp;&nbsp;
    <span>{{ $p->user->name }}, <b>{{ $p->created_at->diffForHumans() }}</b></span></br>


    </div>

标签: laravel

解决方案


$p, or $pst(混淆变量名) is null, 这是因为->first()可以返回null. 您Post的数据库中是否有匹配的记录slug

经验法则;永远不要假设某事存在

Post在尝试访问它的属性之前添加一些逻辑以确保存在:

$post = Post::where("slug", $slug)->first();
if(!$post){
  abort(404);
}
return view('posts.show')->with('post', $post);

// OR

$post = Post::where("slug", $slug)->findOrFail(); // or firstOrFail();
return view('posts.show')->with('post', $post);

另外,检查您的$post->user

@if($post->user)
<img src="/uploads/avatars/{{ $post->user->avatar }}" width="70px" height="60px"/>
<span>{{ $post->user->name }}, <b>{{ $post->created_at->diffForHumans() }}</b></span></br>
@endif

如果$post->user返回null,您将遇到类似的错误。


推荐阅读