You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:39:18