Skip to content

Commit 5659d6a

Browse files
authored
Reuse code on withoutRole and withoutPermission (#2500)
1 parent 8f15d18 commit 5659d6a

File tree

2 files changed

+11
-51
lines changed

2 files changed

+11
-51
lines changed

src/Traits/HasPermissions.php

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ public function permissions(): BelongsToMany
9696
* Scope the model query to certain permissions only.
9797
*
9898
* @param string|int|array|Permission|Collection|\BackedEnum $permissions
99+
* @param bool $without
99100
*/
100-
public function scopePermission(Builder $query, $permissions): Builder
101+
public function scopePermission(Builder $query, $permissions, $without = false): Builder
101102
{
102103
$permissions = $this->convertToPermissionModels($permissions);
103104

@@ -109,11 +110,11 @@ public function scopePermission(Builder $query, $permissions): Builder
109110
);
110111

111112
return $query->where(fn (Builder $query) => $query
112-
->whereHas('permissions', fn (Builder $subQuery) => $subQuery
113+
->{! $without ? 'whereHas' : 'whereDoesntHave'}('permissions', fn (Builder $subQuery) => $subQuery
113114
->whereIn(config('permission.table_names.permissions').".$permissionKey", \array_column($permissions, $permissionKey))
114115
)
115116
->when(count($rolesWithPermissions), fn ($whenQuery) => $whenQuery
116-
->orWhereHas('roles', fn (Builder $subQuery) => $subQuery
117+
->{! $without ? 'orWhereHas' : 'whereDoesntHave'}('roles', fn (Builder $subQuery) => $subQuery
117118
->whereIn(config('permission.table_names.roles').".$roleKey", \array_column($rolesWithPermissions, $roleKey))
118119
)
119120
)
@@ -126,27 +127,9 @@ public function scopePermission(Builder $query, $permissions): Builder
126127
*
127128
* @param string|int|array|Permission|Collection|\BackedEnum $permissions
128129
*/
129-
public function scopeWithoutPermission(Builder $query, $permissions, $debug = false): Builder
130+
public function scopeWithoutPermission(Builder $query, $permissions): Builder
130131
{
131-
$permissions = $this->convertToPermissionModels($permissions);
132-
133-
$permissionKey = (new ($this->getPermissionClass())())->getKeyName();
134-
$roleKey = (new (is_a($this, Role::class) ? static::class : $this->getRoleClass())())->getKeyName();
135-
136-
$rolesWithPermissions = is_a($this, Role::class) ? [] : array_unique(
137-
array_reduce($permissions, fn ($result, $permission) => array_merge($result, $permission->roles->all()), [])
138-
);
139-
140-
return $query->where(fn (Builder $query) => $query
141-
->whereDoesntHave('permissions', fn (Builder $subQuery) => $subQuery
142-
->whereIn(config('permission.table_names.permissions').".$permissionKey", \array_column($permissions, $permissionKey))
143-
)
144-
->when(count($rolesWithPermissions), fn ($whenQuery) => $whenQuery
145-
->whereDoesntHave('roles', fn (Builder $subQuery) => $subQuery
146-
->whereIn(config('permission.table_names.roles').".$roleKey", \array_column($rolesWithPermissions, $roleKey))
147-
)
148-
)
149-
);
132+
return $this->scopePermission($query, $permissions, true);
150133
}
151134

152135
/**

src/Traits/HasRoles.php

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ public function roles(): BelongsToMany
7070
*
7171
* @param string|int|array|Role|Collection|\BackedEnum $roles
7272
* @param string $guard
73+
* @param bool $without
7374
*/
74-
public function scopeRole(Builder $query, $roles, $guard = null): Builder
75+
public function scopeRole(Builder $query, $roles, $guard = null, $without = false): Builder
7576
{
7677
if ($roles instanceof Collection) {
7778
$roles = $roles->all();
@@ -91,10 +92,9 @@ public function scopeRole(Builder $query, $roles, $guard = null): Builder
9192
return $this->getRoleClass()::{$method}($role, $guard ?: $this->getDefaultGuardName());
9293
}, Arr::wrap($roles));
9394

94-
$roleClass = $this->getRoleClass();
95-
$key = (new $roleClass())->getKeyName();
95+
$key = (new ($this->getRoleClass())())->getKeyName();
9696

97-
return $query->whereHas('roles', fn (Builder $subQuery) => $subQuery
97+
return $query->{! $without ? 'whereHas' : 'whereDoesntHave'}('roles', fn (Builder $subQuery) => $subQuery
9898
->whereIn(config('permission.table_names.roles').".$key", \array_column($roles, $key))
9999
);
100100
}
@@ -107,30 +107,7 @@ public function scopeRole(Builder $query, $roles, $guard = null): Builder
107107
*/
108108
public function scopeWithoutRole(Builder $query, $roles, $guard = null): Builder
109109
{
110-
if ($roles instanceof Collection) {
111-
$roles = $roles->all();
112-
}
113-
114-
$roles = array_map(function ($role) use ($guard) {
115-
if ($role instanceof Role) {
116-
return $role;
117-
}
118-
119-
if ($role instanceof \BackedEnum) {
120-
$role = $role->value;
121-
}
122-
123-
$method = is_int($role) || PermissionRegistrar::isUid($role) ? 'findById' : 'findByName';
124-
125-
return $this->getRoleClass()::{$method}($role, $guard ?: $this->getDefaultGuardName());
126-
}, Arr::wrap($roles));
127-
128-
$roleClass = $this->getRoleClass();
129-
$key = (new $roleClass())->getKeyName();
130-
131-
return $query->whereDoesntHave('roles', fn (Builder $subQuery) => $subQuery
132-
->whereIn(config('permission.table_names.roles').".$key", \array_column($roles, $key))
133-
);
110+
return $this->scopeRole($query, $roles, $guard, true);
134111
}
135112

136113
/**

0 commit comments

Comments
 (0)