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

Laravel使用资源类映射数据时报Trying to get property of non-object错误

错误原因

Trying to get property name of non-object 报错的核心是部分Shop记录关联的User数据不存在,$data->user返回的是null而非User模型对象,此时直接访问null的name属性就会触发错误。即使你定义了关联关系,只要对应关联表的数据缺失、外键值无效,就会出现这个问题。

修复方案

1. 预加载关联+筛选存在关联的记录

查询时用with预加载关联避免N+1性能问题,同时用has筛选仅返回存在对应User的Shop记录,从根源避免null关联:

public function index()
{
    // 预加载user关联,仅返回存在对应用户的店铺
    return new ShopCollection(Shop::with('user')->has('user')->get());
}

2. 关联定义加默认模型兜底

在Shop模型的user关联方法里设置默认模型,就算关联数据不存在也返回空的User对象,不会出现null:

public function user()
{
    return $this->belongsTo(User::class)->withDefault([
        'name' => '用户已注销',
        'email' => '',
        'avatar' => '',
        'avatar_original' => ''
    ]);
}

可根据业务需要自定义默认值,就算关联用户被删除也不会报错。

3. 资源类做空值兼容

在映射数据的时候用null合并运算符或者Laravel的optional辅助函数做判断,兼容null的情况:

return [
    'id_toko' => $data->id,
    'name' => $data->name,
    'user' => [
        'name' => optional($data->user)->name ?? '用户已注销',
        'email' => optional($data->user)->email ?? '',
        'avatar' => optional($data->user)->avatar ?? '',
        'avatar_original' => optional($data->user)->avatar_original ?? ''
    ],
    'logo' => api_asset($data->logo),
    ...
];

4. 数据库层面加外键约束(可选)

如果业务要求所有Shop必须对应用户,可以给shops表的user_id加外键约束关联users表的id,设置级联删除,删除用户的时候自动删除关联的店铺,从数据层面避免无效的user_id存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:15:04