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

How (and where) to register a custom query method in Laravel

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

中写了一个查询范围
public function scopeCreatedWithinDays($query,$day){
    $str = $day.' days ago';
    $carbon = new Carbon($str);
    $query->where('created_at', '>=', $carbon);
}

我突然意识到,这种方法非常适合在所有模型中重复使用。所以我需要在一个常见的地方定义这个方法,这样我就可以通过简单地调用 $anyModel->createdWithinDays(30) 轻松地获取最近 x 天内创建的行。但是不知道放在哪里,怎么放...

对于可重用代码,您有 2 个选择:

  1. 创建基本模型并使所有其他模型从该基本模型扩展(该模型应从 Eloquent 模型扩展)
  2. 创建特征并在所有真正需要它的模型中使用该特征。

没有太大区别,但是最好创建具有​​相似功能集的多个特征,而不是创建一个具有多个可重用方法的大 class。

当然你也可以混合使用,这样你就可以将方法放在特征中,并在基础模型中使用这个特征,让所有模型都从这个基础模型扩展

还有在查询生成器上宏化方法的选项:

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

现在,该方法应该可用于任何涉及查询生成器的查询,其中包括所有 Eloquent 个查询。

没有继承,没有特征,没有对任何模型进行更改,您也可以从 DB:: 使用此方法。

AnyModel::createdWithinDays(4)->get();
DB::table('blah')->createdWithinDays(4)->get();

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