A tiny macro that reuse a global scope class as a local scope.
The idea is from: [Proposal] Local query scopes as classes · Issue #636 · laravel/ideas
- PHP:
^8.0
- Laravel:
^9.0 || ^10.0
composer require mpyw/laravel-local-class-scope
class ActiveScope implements Scope
{
public function apply(Builder $query, Model $model): void
{
$query->where('active', true);
}
}
User::scoped(ActiveScope::class)->get();
User::scoped(new ActiveScope())->get();
class AgeScope implements Scope
{
protected $parameters;
public function __construct(...$parameters)
{
$this->parameters = $parameters;
}
public function apply(Builder $query, Model $model): void
{
$query->where('age', ...$this->parameters);
}
}
User::scoped(AgeScope::class, '>', 18)->get();
User::scoped(new AgeScope('>', 18))->get();
User::scoped(ActiveScope::class)->scoped(AgeScope::class, '>', 18)->get();
class User extends Model
{
public function scopeActive(Builder $query): Builder
{
return $this->scoped(ActiveScope::class);
}
}
trait ScopesActive
{
public function scopeActive(Builder $query): Builder
{
return $this->scoped(ActiveScope::class);
}
}
class User extends Model
{
use ScopesActive;
}
class Admin extends Model
{
use ScopesActive;
}