Database 基于过滤参数的按时间过滤多种方法
我确实有这三种方法可以在我的管理仪表板上返回一些数据。它们工作正常。但是,客户机希望按时间进行一些筛选 因此,我有一些参数正在从vuejs发送到后端,如:Database 基于过滤参数的按时间过滤多种方法,database,laravel,eloquent,Database,Laravel,Eloquent,我确实有这三种方法可以在我的管理仪表板上返回一些数据。它们工作正常。但是,客户机希望按时间进行一些筛选 因此,我有一些参数正在从vuejs发送到后端,如: filterByPeriod: { from:YYYY-MM-DD, to: YYYY-MM-DD } 我可以通过请求类获得这些参数,我的问题是如何根据时间过滤这些方法 private function getReservationSources() { return Reservations::where
filterByPeriod: {
from:YYYY-MM-DD,
to: YYYY-MM-DD
}
我可以通过请求类获得这些参数,我的问题是如何根据时间过滤这些方法
private function getReservationSources()
{
return Reservations::where('user_id', request('user_id')
->leftJoin('tracking_codes', 'form_submissions.tracking_code_id', '=', 'tracking_codes.id')
->leftJoin('tracking_sources', 'tracking_sources.id', '=', 'tracking_codes.tracking_source_id')
->select(DB::raw("count(form_submissions.id) as value, tracking_sources.name as name"))
->groupBy('tracking_sources.name')
->orderBy('value', 'desc')
->get();
}
private function getReservationTrackingCodes()
{
return Reservations::where('user_id', request('user_id')
->leftJoin('tracking_codes', 'form_submissions.tracking_code_id', 'tracking_codes.id')
->select(DB::raw('count(tracking_codes.id) as value, tracking_codes.label as name'))
->groupBy('tracking_codes.label')
->orderBy('value', 'desc')
->take(10)
->get();
}
private function getReservationReferrers()
{
return Reservations::where('user_id', request('user_id')
->select(DB::raw("count(form_submissions.id) as value, form_submissions.referrer as name"))
->groupBy('form_submissions.referrer')
->orderBy('value', 'desc')
->take(10)
->get();
}
使用whereBetween()
方法:
->whereBetween('created_at', [Carbon::parse($request->from), Carbon::parse($request->to)])
正如我所看到的,所有的方法都是从同一个模型中提取的,所以你可以用另一种方法提取模型:
private function getReseravtions(){
$builder = Reservations::where('user_id', request('user_id');
return $this->filterByPeriod($builder);
}
private function filterByPeriod(Builder $builder)
{
if(empty(request('filterByPeriod')){
return $builder;
}
$period = json_decode(request('filterByPeriod'));
if($period->from)
{
$builder->where('reservations.created_at', '>=', Carbon::parse($period->from)->startOfDay());
}
if ($period->to)
{
$builder->where("reservations.created_at", "<=", Carbon::parse($period->to)->endOfDay());
}
return $builder;
}
因此,首先,您只需构建雄辩的生成器,而不执行查询,并通过另一个筛选方法发送:
private function getReseravtions(){
$builder = Reservations::where('user_id', request('user_id');
return $this->filterByPeriod($builder);
}
private function filterByPeriod(Builder $builder)
{
if(empty(request('filterByPeriod')){
return $builder;
}
$period = json_decode(request('filterByPeriod'));
if($period->from)
{
$builder->where('reservations.created_at', '>=', Carbon::parse($period->from)->startOfDay());
}
if ($period->to)
{
$builder->where("reservations.created_at", "<=", Carbon::parse($period->to)->endOfDay());
}
return $builder;
}
如果应用了一些过滤,它将根据dat开始和一天结束的碳实例进行过滤。如果不是,那么它将返回未过滤的生成器并继续运行
由于我正在注入构建器,请记住构建器是一个有说服力的构建器,而不是查询构建器实例,所以请在顶部使用它
use Illuminate\Database\Eloquent\Builder;
如果用户不想过滤怎么办?碳::解析(空)@PrStandup如果日期为
null
,则使用when()
方法或where()
闭包添加检查。检查三种不同的工作解决方案。created_at具有模糊的含义,@PrStandup这是一个示例,只需将其更改为要使用的列名即可。