Laravel多对多关系取值报错:Undefined index: role 求助
问题分析与解决方案
首先看你输出的{{$user->roles}}结果:[{"id":1,"role":"Administrator",...}],这是一个集合(数组形式),而不是单个Role对象。你直接写$user->roles->role,相当于要从集合这个数组里取role索引,当然会报Undefined index: role的错误——因为集合本身没有这个属性,集合里的每个元素才有role属性。
解决办法分两种场景:
场景1:每个用户只有一个关联角色(多对多实际业务是单角色)
如果你的业务里每个用户只会有一个角色,可以直接取集合的第一个元素,然后访问role属性:
<td>{{$user->roles->first()->role ?? '无角色'}}</td>
这里用?? '无角色'是为了避免用户没有角色时出现报错,做个兜底处理。
或者你可以在User模型里定义一个访问器,简化视图代码:
// User模型中添加 public function getRoleNameAttribute() { return $this->roles->first()->role ?? '无角色'; }
之后视图里就可以直接写:
<td>{{$user->role_name}}</td>
场景2:用户可能有多个角色,需要全部展示
这种情况需要遍历$user->roles集合,把每个角色的role字段输出:
<td> @foreach($user->roles as $role) {{ $role->role }}@if(!$loop->last), @endif @endforeach </td>
@if(!$loop->last)是用来给多个角色之间加逗号分隔,让输出更美观。
额外提醒:Role模型的关联定义有小问题
看你的Role模型的users关联:
public function users() { return $this->belongsToMany('App\User',"users_roles","usersid","rolesid"); }
这里的外键顺序写反了!belongsToMany方法的第三个参数是当前模型在中间表的外键,第四个是关联模型的外键。Role模型对应的中间表外键是rolesid,User模型对应的是usersid,所以正确的关联应该是:
public function users() { return $this->belongsToMany('App\User',"users_roles","rolesid","usersid"); }
这个错误现在没影响当前的报错,但后续如果你从Role模型反向关联查询用户时,会出现数据错误,建议修正。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

