Laravel新手求助:展示带创建用户的帖子时报错Trying to get property 'name' of non-object
搞定Laravel视图中「Trying to get property 'name' of non-object」错误的方法
嘿,作为Laravel新手碰到这个问题很正常,别慌,咱们一步步排查解决:
第一步:先确认模型关联配置对不对
首先得确保User.php和Post.php里的关联关系写对了,这是基础:
User.php(用户模型)
一个用户能写多篇帖子,所以要定义一对多的关联:
public function posts() { return $this->hasMany(Post::class); }
Post.php(帖子模型)
每篇帖子都属于一个用户,所以是属于关联:
public function user() { return $this->belongsTo(User::class); }
划重点:你的
posts数据库表必须有user_id字段(作为外键),而且类型要和users表的id字段匹配(比如都是unsigned bigint),不然关联会失效。
第二步:控制器里正确查询并预加载关联数据
在PostController.php里查帖子的时候,记得预加载用户关联,既能避免N+1查询问题,也能确保关联数据正确获取:
public function index() { // 预加载user关联,把帖子和对应的用户一起查出来 $posts = Post::with('user')->get(); // 要是你想直接过滤掉没有关联用户的帖子,可以改成下面这句: // $posts = Post::has('user')->with('user')->get(); return view('Home2', compact('posts')); }
第三步:视图里做容错处理(关键!)
就算前面都配置好了,也可能存在帖子没关联用户的情况(比如数据异常),所以在Home2.blade.php里一定要先判断$post->user是否存在,再去拿name属性:
@foreach($posts as $post) <div class="post-item"> <h4>{{ $post->title }}</h4> <p>{{ $post->content }}</p> <!-- 第一种容错写法:三元表达式判断 --> <p>作者:{{ $post->user ? $post->user->name : '匿名用户' }}</p> <!-- 第二种写法:用Laravel的optional辅助函数,更优雅 --> <p>作者:{{ optional($post->user)->name ?? '匿名用户' }}</p> </div> @endforeach
第四步:检查路由是否正确
最后确认web.php里的路由是不是指向了正确的控制器方法:
Route::get('/home2', [PostController::class, 'index'])->name('home2');
额外排查点
- 去数据库里看看
posts表的user_id字段有没有值,有没有存在users表里找不到的ID,要是有这种无效数据,也会触发这个错误。 - 要是你的用户表主键不是
id,或者帖子表的外键不是user_id,得在关联方法里手动指定:
比如Post.php里:public function user() { return $this->belongsTo(User::class, '你的外键字段名', '用户表主键字段名'); }
内容的提问来源于stack exchange,提问作者Inam
相关产品推荐
相关产品推荐

