Laravel Blade添加嵌套foreach循环后用户id值异常报错问题
问题根因
核心是循环变量重名导致外层用户变量被覆盖:
- 外层遍历用户列表使用变量
$item,对应每个用户模型实例 - 内层遍历该用户的角色列表时,同样使用
$item作为遍历变量,内层循环执行完成后,原有的用户$item会被最后一个角色的值覆盖;如果当前用户没有任何角色,内层循环不执行,$item会被置为null,后续调用$item->id时就会抛出读取null属性的错误,也可能出现拿到角色ID、旧残留ID的情况,导致跳转到已删除的记录。
你删除嵌套循环后功能恢复,就是因为不再触发变量覆盖的逻辑。
解决方案
将内层循环的遍历变量改为不重名的名称,比如$role即可,修改后代码如下:
@forelse($users as $item) <tr> <td>{{ $loop->iteration }}</td> <td>{{ $item->name }}</td> <td>{{ $item->email }}</td> <td> @if($item->email_verified_at) {{ "verified" }} @else {{ "not verified" }} @endif </td> <td> @foreach($item->roles as $role) {{ $role['name'] }} @endforeach </td> <td> <a href="{{ route('user.edit', $item->id) }}">Edit</a> <form action="{{ route('user.destroy', $item->id) }}" method="POST"> @csrf @method('delete') <button onclick="return confirm('Are you sure ??')" type="submit">Delete</button> </form> </td> </tr> @empty <tr> blank data </tr> @endforelse
可选优化
如果要兼容无角色的用户,避免角色列空值,可以在内层循环加空判断:
<td> @foreach($item->roles as $role) {{ $role['name'] }} @empty 无角色 @endforeach </td>
内容的提问来源于stack exchange,提问作者Salamah Salamah
相关产品推荐
相关产品推荐

