Laravel's Eloquent

时间:2018-01-20 23:53:22

标签: php mysql laravel eloquent

我正在寻找一种方法来制作一个动态的& Laravel中的全局模型过滤器。 我正在想象我的User.php模型中的以下函数:

public function filter() {
    return ($someVariable === true);
}

每当我使用Eloquent的查询构建器进行查询时,我只希望用户在上面的过滤器返回true时显示在集合中。我本以为会有这样的功能,但快速查看文档会另有说明。或者我错过了吗?

3 个答案:

答案 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。

可能不是最干净的解决方案,而是目前的工作方式。