Laravel Eloquent查询报错:Trying to get property 'user' of a non-object 如何解决?
解决 "Trying to get property 'user' of a non-object" 错误
嘿,这个错误我之前也碰到过,其实很好解决,咱们一步步来理清楚:
错误原因
你看到的这个报错,本质是$posts->first()返回了null——也就是说你的数据库里可能还没有任何文章数据,或者Post::all()查询出来的是空集合。当你试图对null(这不是一个对象)访问user属性时,PHP自然就会抛出这个错误。
解决方案
根据你的场景,这里有几个实用的处理方式:
1. 先检查是否存在文章,再访问关联
最稳妥的方式就是先判断集合里有没有元素,再去取作者信息:
$posts = Post::all(); $posts->load('user'); // 先取出第一篇文章,同时判断是否存在 if ($firstPost = $posts->first()) { $author = $firstPost->user; // 这里写展示作者的逻辑 } else { // 没有文章时的提示,比如显示"暂无文章" }
2. 用Laravel的optional()辅助函数优雅处理
Laravel提供了optional()函数,可以帮你避免空对象报错。如果传入的参数是null,它会返回一个空对象,访问属性时只会得到null而不会报错:
$posts = Post::all()->load('user'); $author = optional($posts->first())->user; // 之后你可以再判断$author是否存在,再做展示
3. 优化查询逻辑(如果只需要第一篇文章的作者)
如果你的需求只是获取第一篇文章的作者,其实没必要先查所有文章再预加载关联,直接一步到位查询带关联的单篇文章,更高效:
$firstPost = Post::with('user')->first(); if ($firstPost) { $author = $firstPost->user; }
额外提醒
你原来的代码里,Post::all()后调用load('user')是预加载关联的正确姿势(能避免N+1查询问题),这个逻辑本身没问题,只是忽略了"集合可能为空"的情况。记住:永远不要假设数据库查询一定会返回结果,在访问对象属性前先做非空判断就不会踩这个坑啦。
内容的提问来源于stack exchange,提问作者Danny Younes
相关产品推荐
相关产品推荐

