【问题标题】:Filter by time multiple methods based on filter params基于过滤器参数的时间多种方法过滤
【发布时间】:2018-06-23 07:43:15
【问题描述】:

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

所以我确实有一些从 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();
}

【问题讨论】:

    标签: database laravel eloquent


    【解决方案1】:

    正如我所见,所有方法都是从同一个模型中提取的,所以你可以用另一种方法拉取模型:

    private function getReseravtions(){
    
     $builder = Reservations::where('user_id', request('user_id');
    
     return $this->filterByPeriod($builder);
    
    }
    

    所以首先你只需构建 eloquent 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 getReservationReferrers()
    {
    
            return $this->getReservations()
                ->select(DB::raw("count(form_submissions.id) as value, form_submissions.referrer as name"))
                ->groupBy('form_submissions.referrer')
                ->orderBy('value', 'desc')
                ->take(10)
                ->get();
     }
    

    如果您应用了一些过滤,它将根据 dat 的开始和一天结束的 carbon 实例进行过滤。如果不是,那么它将返回未过滤的构建器并继续运行。

    由于我要注入构建器,请记住构建器是一个雄辩的构建器,而不是查询构建器实例,所以在顶部使用它

    use Illuminate\Database\Eloquent\Builder;
    

    【讨论】:

      【解决方案2】:

      使用whereBetween() 方法:

      ->whereBetween('created_at', [Carbon::parse($request->from), Carbon::parse($request->to)])
      

      【讨论】:

      • 如果用户不想过滤怎么办?碳::解析(空)? ?
      • @PrStandup 如果日期为null,则使用when() 方法或where() 闭包添加检查。查看this answer 了解三种不同的工作解决方案。
      • created_at 含义不明确,
      • @PrStandup 这是一个示例,只需将其更改为您要使用的列名即可。
      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2020-10-13
      相关资源
      最近更新 更多