我正在寻找一种方法来制作一个动态的& Laravel中的全局模型过滤器。 我正在想象我的User.php模型中的以下函数:
public function filter() {
return ($someVariable === true);
}
每当我使用Eloquent的查询构建器进行查询时,我只希望用户在上面的过滤器返回true时显示在集合中。我本以为会有这样的功能,但快速查看文档会另有说明。或者我错过了吗?
答案 0 :(得分:1)
我认为您可以使用Collection宏,但是您需要将所有雄辩的get();
添加到get()->userDynamicFilter();
Collection::macro('userDynamicFilter', function () {
//$expected = ...
return $this->filter(function ($value) use($expected) {
return $value == $expected;
});
});
答案 1 :(得分:0)
我相信您正在寻找的是查询范围。
它们是可以在全局或本地上下文中定义的方法,它们会改变给定模型的当前查询。
https://laravel.com/docs/5.5/eloquent#query-scopes
例如:
假设我有一个名为" Teams"的数据库表。它上面有一个名为" Wins。"如果我想要检索所有在A和B之间有多个胜利的团队,我可以在团队模型上编写以下本地范围方法:
public function scopeWinsBetween($query, int $min, int $max)
{
return $query->whereBetween('wins', $min, $max);
}
可以这样调用:
$teams = Teams::winsBetween(50, 100)->get();
答案 2 :(得分:0)
感谢。现在,我只是使用以下代码向模型添加了一个后置过滤器选项:
// Apply a post filter on the model collection
$data = $data->filter(function($modelObject) {
return (method_exists($modelObject, 'postFilter')) ? $modelObject->postFilter($modelObject) : true;
});
创建集合后,在Illuminate/Database/Eloquent/Builder.php
的get()函数中。这允许我在我的模型中添加一个函数postFilter($model)
,返回true或false。
可能不是最干净的解决方案,而是目前的工作方式。