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
相关产品推荐
相关产品推荐

