Search code examples
laravellaravel-9laravel-permission

duplicate data in blade when send data


i´m trying to show all my roles in my edit blade and with checkbox, that this checks it´s checked if this role have this permission.

my problem it´s when send data permissions and permissions to this role, all permission name it´s duplicate.

enter image description here

for set roles and permission i´m using laravel-permission/spatie

in my controller i have this:

public function edit($id)
    {
        $role = Role::find($id);
        $permissions = Permission::all();
        $permissionAssigned = Role::find($id)->givePermissionTo();

        return view('opciones.roles.edit', ['role' => $role, 'permissions' => $permissions, 
                                            'permissionAssigned' => $permissionAssigned["permissions"] ]);
    }

and in my blade i have this:

<h3>Permissions</h3>
                            <div class="row flex-row justify-content-center"> 
                              @foreach($permissions as $permission)
                                @foreach ($permissionAssigned as $asigned)
                                  @if($permission->name == $asigned->name)
                                    <div class="form-check p-4">
                                      <input class="form-check-input" checked type="checkbox" name="permission[]" value="{{ $permission->name }}" id="flexCheckDefault">
                                      <label class="form-check-label" for="flexCheckDefault">{{ $permission->name }}</label>
                                    </div>                                                                      
                                  @endif
                                @endforeach
                                <div class="form-check p-4">
                                  <input class="form-check-input" type="checkbox" name="permission[]" value="{{ $permission->name }}" id="flexCheckDefault">
                                  <label class="form-check-label" for="flexCheckDefault">{{ $permission->name }}</label>
                                </div>
                              @endforeach                                                             
                            </div>

i don´t know that i´m doing wrong. I know that i have a logic problem, but i can´t solve it.

Thanks for readme and sorry for my bad english


Solution

  • You just need to pass the Role with associated Permissions and all Perrmissions to compare against, from the controller.

    public function edit($id)
    {
        $role = Role::with('permissions')->find($id);
        $permissions = Permission::all();
    
        return view('opciones.roles.edit', ['role' => $role]);
    }
    

    In the view

    <h3>Permissions</h3>
    <div class="row flex-row justify-content-center"> 
        @foreach($permissions as $permission)
            <div class="form-check p-4">
                <input type="checkbox"
                       id="flexCheckDefault"
                       class="form-check-input"
                       name="permission[]" 
                       value="{{ $permission->name }}" 
                       @checked((old($permission->name, $role->permissions->contains('name', $permission->name)) />
                <label class="form-check-label" for="flexCheckDefault">{{ $permission->name }}</label>
            </div>   
       @endforeach                                                             
    </div>