Database 基于过滤参数的按时间过滤多种方法

Database 基于过滤参数的按时间过滤多种方法,database,laravel,eloquent,Database,Laravel,Eloquent,我确实有这三种方法可以在我的管理仪表板上返回一些数据。它们工作正常。但是,客户机希望按时间进行一些筛选 因此,我有一些参数正在从vuejs发送到后端,如: filterByPeriod: { from:YYYY-MM-DD, to: YYYY-MM-DD } 我可以通过请求类获得这些参数,我的问题是如何根据时间过滤这些方法 private function getReservationSources() { return Reservations::where

我确实有这三种方法可以在我的管理仪表板上返回一些数据。它们工作正常。但是,客户机希望按时间进行一些筛选

因此,我有一些参数正在从vuejs发送到后端,如:

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这是一个示例,只需将其更改为要使用的列名即可。