public static function updateRolePermissions(AclRole $role) { $group_resources = GroupResources::getGroupResources(); $perm_ids = []; /* @var $perm \Volicon\Acl\AclPermission */ foreach ($role->permissions as $key => $perm) { $permission_id = $group_resources->search($perm->resource); $perm_ids[] = $permission_id; $role->permissions[$key]->permission_id = $permission_id; if ($permission_id === FALSE) { throw new \Exception('Resource not exists: ' . $perm->resource); } } $db_role_perm = RolePermission::where('role_id', '=', $role->role_id)->get()->keyBy('permission_id'); $db_perm_ids = $db_role_perm->lists('permission_id'); $perm_to_delete = array_diff($db_perm_ids, $perm_ids); $perm_to_add = array_diff($perm_ids, $db_perm_ids); if ($perm_to_delete) { RolePermission::where('role_id', '=', $role->role_id)->whereIn('permission_id', $perm_to_delete)->delete(); } foreach ($role->permissions as $perm) { if (in_array($perm->permission_id, $perm_to_add)) { RolePermission::create(['role_id' => $role->role_id, 'permission_id' => $perm->permission_id, 'values' => json_encode($perm->values), 'allowed' => $perm->allowed]); } else { RolePermission::where('role_id', '=', $role->role_id)->where('permission_id', '=', $perm->permission_id)->update(['values' => json_encode($perm->values), 'allowed' => $perm->allowed]); } } }