Laravel API报错Trying to get property of non-object,$user确为对象
问题根源与解决方案
你的问题核心在于User模型的boards()方法硬依赖了认证用户,但这个API端点不需要认证,导致auth()->user()返回null,调用->id时直接触发了“Trying to get property of non-object”的500错误。
为什么Web端能正常工作?
Web场景下用户处于登录状态,auth()->user()能拿到当前登录的用户对象,所以auth()->user()->id是有效的;但API端点无需认证,auth()->user()为空,自然就报错了。临时调用Auth::login($user)能解决只是因为强行给当前请求塞了一个认证用户,但这完全违背了“无需登录”的需求。
正确的修改方式
你需要把boards()方法改成基于当前User实例的查询,彻底摆脱对认证系统的依赖:
方式1:修改现有方法
把原来代码里的auth()->user()->id替换成$this->id(因为这个方法属于User模型,$this就代表当前的用户对象):
public function boards() { $participatesIn = Board_User::where('user_id', $this->id)->get(); return Board::whereIn('id', $participatesIn->pluck('board_id'))->get(); }
方式2:使用Eloquent多对多关联(更推荐)
从你的代码来看,Board_User是User和Board之间的多对多中间表,完全可以用Laravel的Eloquent关联来简化实现,既优雅又高效:
// 在User模型中定义关联 public function boards() { // 第二个参数是中间表名,后面两个参数分别是当前模型和关联模型在中间表的外键 return $this->belongsToMany(Board::class, 'board_user', 'user_id', 'board_id'); }
改完之后,$user->boards会直接返回该用户关联的所有Board集合,Laravel会自动帮你处理中间表的查询逻辑,不需要自己手动写whereIn。
验证修改
完成上述修改后,直接访问/api/users/5/boards,$user->boards就能正常返回对应的模型集合,不需要任何登录操作。
内容的提问来源于stack exchange,提问作者Informatyka 3x INF
相关产品推荐
相关产品推荐

