Laravel 5.6中Eloquent API Resource无法获取中间表数据求助
解决Laravel 5.6中API资源返回角色字段缺失的问题
嘿,我来帮你搞定这个角色字段不显示的问题!先梳理下你的代码里几个关键问题点,然后一步步修正:
1. 修正API资源里的错误用法
你的API资源代码存在三个需要调整的地方:
- 字段名匹配错误:你的
role表存储角色名称的字段是role,但你写的是$this->roles->name,这里要改成对应表的role字段; - 关系检查方法用错:
whenPivotLoaded是用来检测当前模型是否加载了中间表的额外pivot字段,而你需要判断的是roles关联关系是否被预加载,应该用whenLoaded('roles'); - 集合处理错误:
$this->roles是一个集合(因为用户可拥有多个角色),直接取->role会报错,需要用pluck提取所有角色名称,或者根据业务需求取单个角色。
修正后的API资源代码:
/** * Api Resource */ public function toArray($request) { return [ 'id' => $this->id, 'username' => $this->username, 'email' => $this->email, // 多角色场景:返回所有角色名称数组 'roles' => $this->whenLoaded('roles', function () { return $this->roles->pluck('role'); }) // 单角色场景:返回单个角色名称(需确保用户只有一个角色) // 'role' => $this->whenLoaded('roles', function () { // return $this->roles->first()->role ?? null; // }) ]; }
2. 确保查询用户时预加载roles关系
如果控制器查询用户时没有预加载roles关联,whenLoaded会判定关系未加载,从而不返回角色字段。所以一定要用with('roles')预加载关联:
// 控制器示例代码 public function show($id) { $user = User::with('roles')->findOrFail($id); return new UserResource($user); }
3. 验证Role模型的字段访问权限(可选)
如果你的Role模型没有配置字段白名单,可能导致Laravel无法正常访问role字段。可以在Role模型里添加:
class Role extends Model { protected $fillable = ['role', 'desc']; // 或者设置空黑名单,允许所有字段赋值 // protected $guarded = []; public function users() { return $this->belongsToMany(User::class); } }
调整完成后,返回的API数据应该就能正常包含角色字段了,比如多角色场景的返回结果:
{ "data": { "id": 1, "username": "john", "email": "john.doe@mail.com", "roles": ["admin", "editor"] } }
内容的提问来源于stack exchange,提问作者Shinoda_
相关产品推荐
相关产品推荐

