如何(以及在何处)在 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 个选择:
- 创建基本模型并使所有其他模型从该基本模型扩展(该模型应从 Eloquent 模型扩展)
- 创建特征并在所有真正需要它的模型中使用该特征。
没有太大区别,但是最好创建具有相似功能集的多个特征,而不是创建一个具有多个可重用方法的大 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
方法。
在我的应用程序中,我需要检索过去 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 个选择:
- 创建基本模型并使所有其他模型从该基本模型扩展(该模型应从 Eloquent 模型扩展)
- 创建特征并在所有真正需要它的模型中使用该特征。
没有太大区别,但是最好创建具有相似功能集的多个特征,而不是创建一个具有多个可重用方法的大 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
方法。