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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:06:11