首页 > 解决方案 > Laravel 找出角色中选择了哪些权限

问题描述

在我的网络应用程序中,我有两个表role,并且我可以将每个表与表permission同步permissionrole

我想找出哪些权限在角色的权限中,因为选择然后进入视图,例如我有 10 个权限,其中四个项目与role表同步,我想找出它们

$role = Role::with('permission')->whereId($id)->first();
$permissions = Permission::all();
dd($role,$role->permission());

输出是:

App\Entities\Role {#1816 ▼
  ...
  #relations: array:1 [▼
    "permission" => Illuminate\Database\Eloquent\Collection {#1814 ▼
      #items: array:2 [▼
        0 => App\Entities\Permission {#1829 ▼
          ...
          #attributes: array:5 [▼
            "id" => 4
            "name" => "create-comment"
            "label" => "user can create a comment"
            ...
          ]
          ...
        }
        1 => App\Entities\Permission {#1826 ▶}
      ]
    }
  ]
  ...
}

Illuminate\Database\Eloquent\Collection {#1812 ▼
  #items: array:3 [▼
    0 => App\Entities\Permission {#1820 ▼
      ...
      #attributes: array:5 [▼
        "id" => 4
        "name" => "create-comment"
        "label" => "user can create a comment"
        ...
      ]
      ...
    }
    1 => App\Entities\Permission {#1828 ▶}
    2 => App\Entities\Permission {#1827 ▶}
  ]
}

如您所见"create-comment",权限在角色的权限中,我怎样才能找到它们?

例如:

$role = Role::with('permission')->whereId($id)->first();
$permissions = Permission::get();

dd($role->hasPermission($permissions));


class Role extends Model
{
    ...
    public function hasPermission($permission)
    {
        //return which permissions are in role
    }
}

或使用contains

@foreach($permissions as $permission)
    <option value="{{$permission->id}}" @if($role->permission->contains('id',$permission->id)) selected="selected"  @else '' @endif>
        {{$permission->name}} {{$permission->label}}
    </option>
@endforeach

标签: phplaravel

解决方案


这段代码Blade解决了我的问题:

@foreach($permissions as $permission)
    <option value="{{$permission->id}}" @if($role->permission->contains('id',$permission->id)) selected="selected"  @else '' @endif>
        {{$permission->name}} <span class="text-danger">({{$permission->label}})</span>
    </option>
@endforeach

推荐阅读