mpyw/laravel-local-class-scope

一个微小的宏,用于重用全局作用域类作为局部作用域

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

This package is auto-updated.

Last update: 2024-09-13 15:24:53 UTC


README

一个微小的宏,用于重用全局作用域类作为局部作用域。

灵感来源于: [提案] 将局部查询作用域作为类 · 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;
}