laravel - 在每个查询构建器调用 Laravel 中的模型之前应用过滤器
问题描述
每次要查询特定模型时是否可以应用过滤器?所以不要每次都写这样的东西:
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()
方法的查询调用,而不会影响其他查询调用。
解决方案
您说的是全局范围: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();
推荐阅读
- java - 在neo4j中比较两个图有什么简单的方法吗
- java - Gradle,使用 gpg 进行多项目签名。访问后无法配置“发布”扩展
- project-reactor - 在 GatewayFilter 中处理 Mono.empty()
- python - numpy 数组的 set_printoptions 不适用于 numpy ndarray?
- android - 如何从 React Native 中的 Drawer 调用另一个组件中的函数
- spring-boot - 如何将带注释的类@Configuration 作为 REST 响应发送?在springboot中
- c# - 不使用 AsEnumerable() 拆分 DataTable
- javascript - Javascript 承诺与 promise.all 链接不起作用?
- sas - 将计数器附加到通过取消引用宏变量获得的字符串
- python - 创建超级用户错误 - 没有这样的列:app_profile.password