我正在开发报告系统,我想获取连续六(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);
}
});
答案 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>