如何使用laravel获取连续6个月没有报告的用户?

时间:2019-04-11 05:53:55

标签: laravel laravel-5 eloquent

我正在开发报告系统,我想获取连续六(6)个月未报告的用户。我该如何实现?

我尝试了下面的代码,但没有得到想要的输出。还有一个问题。假设日期间隔为12个月。如何确定连续六个月没有报告?

$dateStart = '2018-10-31';
$dateEnd = '2019-03-31';

$intervals = Carbon::parse($dateStart)->diffInMonths($dateEnd);

$users = $users->whereDoesntHave('reports', function($query) use($intervals) {

    for ($i = 5; $i >= 0; $i--) { 

        $firstMonth = Carbon::parse($dateEnd)->subMonthsNoOverflow($intervals);

        $query->where('date', '>=', $firstMonth->format('Y-m-d'))->where('date', '<=', $dateEnd);
    }

});

3 个答案:

答案 0 :(得分:1)

我要做的是,我将根据开始和结束日期每月创建一个循环,然后检查他是否没有该月的报告。如果该月没有报告,我将增加一个计数器,并且如果该计数器达到6个计数,则退出循环并满足条件。

以下是基本概念:

$dateStart = '2018-10-31';
$dateEnd = '2019-10-31';

$count = 0;
$no_report_for_6_consecutive_months = 0 ;

startloop
   $have_report = Model::whereMonth('date_column', $date_of_loop->format('m'))->get();

   if($have_report->count()){
      $count = 0;
   }
   else{
      $count++;
   }

   if($count==6){
     $no_report_for_6_consecutive_months = 1 ;
     break;
   }
endloop

答案 1 :(得分:0)

您必须找到连续报告六(6)次并与所有用户有所不同的不同用户。

$enddate = 2019-04-15;
$startdate = date("Y-m-d", strtotime("-6 months", strtotime($enddate)));
$users = User::all();
$usersIdArray = $users->pluck("id")->all();
$reportedBy = Report::where('date', '>=', $startdate)
                           ->where('date', '<=', $enddate)
                           ->distinct("user_id")->get();

$reportedByIdArray = $reportedBy ->pluck("id")->all();

$notReportedByIdArray = array_values(array_diff($usersIdArray , $reportedByIdArray));
$notREportedUsers = User::whereIn(id", $notReportedByIdArray)->get();
//its a way but not tested

答案 2 :(得分:0)

我从this answer修改了查询

我相信查询可以写得更干净。如果您愿意,我会让您这样做。

<web.server>....</web.server>

现在,您将获得所有具有4个额外字段的用户: date_start ; date_end day_gap month_gap

如果您希望用户之间的间隔为6个月,可以执行以下操作:

<web.server>