Laravel中如何基于已分配权限数组正确渲染带选中状态的复选框
Laravel权限复选框重复渲染问题修复方案
问题原因
出现复选框重复的核心原因是嵌套了两层循环:外层遍历全部权限(4次),内层遍历已分配权限(2次),每一个权限都会输出和已分配权限数量相等的复选框,最终总数是4*2=8个,远超预期的4个。
修复方案
先把已分配权限的ID提取为一维数组,遍历全部权限时直接判断当前权限ID是否在已分配ID数组中即可,无需嵌套循环。
第一步:提取已分配权限ID数组
可以在Blade模板顶部先处理,也可以提前在控制器中处理好传到模板:
// 如果 $assigned_vendor_permissions 是Laravel集合 @php $assignedPermissionIds = $assigned_vendor_permissions->pluck('id')->toArray(); @endphp // 如果 $assigned_vendor_permissions 是原生数组 @php $assignedPermissionIds = array_column($assigned_vendor_permissions, 'id'); @endphp
第二步:修改循环渲染代码
去掉内层循环,直接通过in_array判断是否选中:
@foreach ( $vendor_permissions as $vendor_permission ) <td style="width: 15%"> <label class="checkbox"> <input type="checkbox" name="permissions[]" id="{{ $vendor_permission->name }}" {{ in_array($vendor_permission->id, $assignedPermissionIds) ? 'checked' : '' }} value="{{ $vendor_permission->id }}" > <span></span> </label> </td> @endforeach
如果用Laravel的集合方法,也可以直接用contains判断,不用转数组:
{{ $assigned_vendor_permissions->contains('id', $vendor_permission->id) ? 'checked' : '' }}
优化建议
如果是频繁用到的判断逻辑,推荐在控制器中就把$assignedPermissionIds处理好传到模板,减少模板层的逻辑处理,性能也更好。
内容的提问来源于stack exchange,提问作者rjcode
相关产品推荐
相关产品推荐

