在 laravel 8 的 jwt 认证中,`auth()->user()` 默认仅返回用
户基础模型实例,不包含关联数据;本文详解如何通过懒加载(`load()`)或默认预加载(`$with`)方式,在登录成功响应中一并返回带关系的用户信息(如角色、权限等)。
在基于 JWT 的 API 认证流程中,登录成功后通常需返回当前认证用户的基础信息及关键关联数据(例如:用户所属角色、部门、头像配置等)。但直接调用 auth()->guard('api')->user() 仅获取未加载关系的原始模型实例,无法满足前端对结构化嵌套数据的需求。
在登录逻辑中,先获取认证用户,再显式加载所需关联。假设 User 模型已定义 role() 关系(一对一),且 Role 模型存在 permissions 关系,可链式加载:
$user = auth()->guard('api')->user();
// 加载单层关系(如 role)
$user->load('role');
// 或加载多层嵌套关系(如 role.permissions)
$user->load('role.permissions');
// 也可同时加载多个独立关系
$user->load(['role', 'profile', 'department']);
return response()->json([
'success' => true,
'user' => $user,
'token' => $token
], 200);⚠️ 注意:load() 是「懒加载」,仅对已存在的模型实例生效,不会触发额外的 N+1 查询(因底层使用一次性 WHERE IN 查询优化),适合在少数关键接口中按需启用。
若绝大多数涉及用户的 API 响应都需要携带 role 数据(如 /api/user, /api/profile, 登录响应等),可在 User 模型中声明 $with 属性,实现自动预加载:
// app/Models/User.php
belongsTo(Role::class);
}
}此后,所有通过 Eloquent 查询得到的 User 实例(包括 auth()->user() 返回的实例)将自动附带 role 数据,无需手动调用 load()。
? 提示:$with 仅影响 Eloquent 查询结果,对 auth()->user() 是否生效取决于该方法底层是否调用 Eloquent 查询(Laravel 8+ 的 TokenGuard 在 user() 中会通过 User::find($id) 获取模型,因此 $with 生效)。
protected $hidden = ['password', 'remember_token', 'two_factor_secret'];
| 方案 | 适用场景 | 灵活性 | 维护成本 |
|---|---|---|---|
| ->load() | 单点接口按需加载(如仅登录响应需角色) | ★★★★★ | 低(代码内聚) |
| $with 属性 | 全局高频一致需求(多数用户接口均需角色) | ★★☆☆☆ | 中(影响所有查询) |
二者均可安全用于生产环境。初学者建议从 load() 入手,待业务稳定后再评估是否升格为 $with 全局策略。