mpyw/laravel-local-class-scope

A tiny macro that reuse a global scope class as a local scope

v2.1.2 2023-03-13 11:47 UTC

This package is auto-updated.

Last update: 2024-04-13 14:34:43 UTC


README

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

Requirements

  • PHP: ^8.0
  • Laravel: ^9.0 || ^10.0

Installing

composer require mpyw/laravel-local-class-scope

Usage

Simple 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();

Scope that takes arguments

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();

Combination

User::scoped(ActiveScope::class)->scoped(AgeScope::class, '>', 18)->get();

Re-define as a local method scope

class User extends Model
{
    public function scopeActive(Builder $query): Builder
    {
        return $this->scoped(ActiveScope::class);
    }
}

Share local method re-definition via trait

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;
}