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

Laravel belongsTo关联访问报Trying to get property of non-object错误

问题原因分析
  • 报错核心是$this->creator为非对象,也就是部分Post对应的关联User不存在。你调试时用dd()会直接终止程序,仅执行了第一条符合条件的Post的访问器,这条数据的关联User和头像都存在,所以调试时能正常拿到结果,全量执行时遇到关联User缺失的Post就会抛出异常。
  • 额外隐患:你当前的写法存在N+1查询问题,Post的$with仅预加载了creator,没有预加载User的profileImage关联,每一条Post渲染creator_image属性时都会单独查询一次Image表,数据量大时性能会很差。
解决方案

1. 访问器增加容错处理

首先在访问器中增加空判断,避免关联缺失时直接报错:

PHP 8及以上版本(推荐)

使用null安全运算符:

public function getCreatorImageAttribute()
{
    // 可以自定义关联缺失时返回的默认头像地址
    return $this->creator?->profileImage?->url ?? '/default-avatar.png';
}

低版本PHP

使用Laravel自带的optional()辅助函数:

public function getCreatorImageAttribute()
{
    return optional(optional($this->creator)->profileImage)->url ?? '/default-avatar.png';
}

2. 优化预加载避免N+1问题

修改你查询时的预加载逻辑,嵌套加载关联:

Model::with('posts.creator.profileImage')->find($id);

如果需要全局生效,也可以修改Post模型的$with属性:

protected $with = ['creator', 'creator.profileImage'];

3. 从数据层避免关联缺失(可选)

如果业务规则要求所有Post必须有对应创建者,可以给posts表的creator_id字段增加外键约束,关联users表的id字段,设置级联删除或者禁止删除存在关联Post的用户,从根源避免creator为空的情况。


内容的提问来源于stack exchange,提问作者Reundo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:24:02