@@ -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 /**
0 commit comments