如何(以及在​​哪里)在 Laravel 中注册自定义查询方法

Tan*_*may 5 php oop code-reuse traits laravel

在我的应用程序中,我需要检索过去 7 天内注册的用户。后来我意识到我还需要检查30天和365天等等。所以我在我的 User.php 中写了一个查询范围:

public function scopeCreatedWithinDays($query,$day){
    $str = $day.' days ago';
    $carbon = new Carbon($str);
    $query->where('created_at', '>=', $carbon);
}
Run Code Online (Sandbox Code Playgroud)

我突然意识到,这种方法非常适合在所有模型中重复使用。所以我需要在一个共同的地方定义这个方法,这样我就可以x通过简单地调用$anyModel->createdWithinDays(30). 但我不知道把它放在哪里以及如何...

lag*_*box 6

还可以选择在查询生成器上对方法进行宏处理:

\Illuminate\Database\Query\Builder::macro('createdWithinDays', function ($day) {
    return $this->where('created_at', '>=', new \Carbon\Carbon($day .' days ago'));
});
Run Code Online (Sandbox Code Playgroud)

现在,您应该可以将该方法用于任何涉及 Query Builder 的查询,其中包括所有 Eloquent 查询。

没有继承,没有特征,没有改变任何模型,你也可以使用这种方法DB::

AnyModel::createdWithinDays(4)->get();
DB::table('blah')->createdWithinDays(4)->get();
Run Code Online (Sandbox Code Playgroud)

抱歉.. 'and where' 部分:将宏添加到服务提供者boot方法。