代码之家  ›  专栏  ›  技术社区  ›  szaman

在每次查询生成器调用Laravel中的模型之前应用筛选器

  •  0
  • szaman  · 技术社区  · 5 年前

    是否可以在每次查询特定模型时应用筛选器?所以不要每次都写这样的东西:

    User::where('exclude', false)->all();
    User::where('exclude', false)->first();
    User::where('exclude', false)->where(...);
    ...
    

    您可以在模型本身中包含那个WHERE子句吗?结果将使上述查询看起来如下:

    User::all();
    User::first();
    User::where(...);
    ...
    

    使该字段的所有用户 exclude 设置为true不会出现在查询结果中。

    此外,它是否也适用于引用模型的每个关系?例如:

    $post->user();
    $group->users();
    

    不知道该如何处理。首先,我尝试重写一个这样的方法:

    public static function all($columns = []) {
        return self::where('exclude', false)->get($columns);
    }
    

    然而,它似乎什么也没做。此外,即使这样做,它也只会影响专门使用 all() 方法,而不是其他方法。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Jeff    5 年前

    你说的是全球范围: https://laravel.com/docs/5.7/eloquent#global-scopes

    如下所示:

    class User extends Model
    {
    
      protected static function boot()
      {
        parent::boot();
    
        static::addGlobalScope('exclude', function (Builder $builder) {
            $builder->where('exclude', false);
        });
      }
    }
    

    这会影响此模型的任何查询。如果需要:

    User::withoutGlobalScope('exclude')->get();