如何使用laravel获取连续6个月没有报告的用户?
我正在开发一个报告系统,我想获取连续六(6)个月没有报告的用户。我如何做到这一点 我尝试了下面的代码,但没有得到想要的输出。还有一个问题。假设日期间隔为12个月。如何确定是否连续6个月没有报告如何使用laravel获取连续6个月没有报告的用户?,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我正在开发一个报告系统,我想获取连续六(6)个月没有报告的用户。我如何做到这一点 我尝试了下面的代码,但没有得到想要的输出。还有一个问题。假设日期间隔为12个月。如何确定是否连续6个月没有报告 $dateStart = '2018-10-31'; $dateEnd = '2019-03-31'; $intervals = Carbon::parse($dateStart)->diffInMonths($dateEnd); $users = $users->whereDoesntH
$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);
}
});
$dateStart='2018-10-31';
$dateEnd='2019-03-31';
$interval=Carbon::parse($dateStart)->diffInMonths($dateEnd);
$users=$users->whereDoesntHave('reports',function($query)use($interval){
对于($i=5;$i>=0;$i--){
$firstMonth=Carbon::parse($dateEnd)->subMonthsNoOverflow($interval);
$query->where('date','>=',$firstMonth->format('Y-m-d'))->where('date','您必须找到连续六(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
$enddate=2019-04-15;
$startdate=日期(“Y-m-d”,标准时间(“-6个月”,标准时间($enddate));
$users=User::all();
$usersIdArray=$users->Pull(“id”)->all();
$reportedBy=Report::where('date','>=',$startdate)
->其中('date','我将根据开始和结束日期每月创建一个循环,然后检查他是否没有该月的报告。如果没有该月的报告,我将增加一个计数器,如果该计数器达到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
我已从中修改了查询
我相信查询可以写得更干净。如果你愿意,我会让你这么做
App\User::select('*')
->from(\DB::raw("(select
low.*,
low.`date` as date_start,
high.`date` as date_end,
to_days(high.`date`) - to_days(low.`date`) as day_gap,
period_diff(date_format(high.`date`, '%Y%m'),
date_format(low.`date`, '%Y%m')) as month_gap
from reports low, reports high
where high.`date` =
(select
min(`date`)
from reports
where
`date` > low.`date`
and low.user_id = high.user_id
)
) as d")
)->get();
现在,您将获得具有4个额外字段的所有用户:日期开始;日期结束,日期间隔和月份间隔
如果您希望用户的月间隔为6个月,您可以这样做:
App\User::select('*')
->from(\DB::raw("..."))
->where('month_gap', '>=', 6)
->get();
这可能会对您有所帮助吗?您使用laravel eloquent或查询生成器获取数据的目的是什么。@SurenderSinghRawat我使用eloquent。@CBA谢谢,但我如何使用eloquent实现这一目的?@Jearson在使用eloquent之前,您需要知道您期望的SQL查询结果。一旦您有了符合您需要的工作查询将其转换为Eloquent会更容易。Eloquent的查询似乎很复杂,您可能需要使用设置开始日期和结束日期来结束。您必须从输入中设置开始日期和结束日期…但如果月份为12个月,该怎么办?我如何知道用户是否在6个月内没有报告?您必须获得一个输入日期(可能是结束日期)用6个月的间隔计算开始日期谢谢。但是条件应该是连续6个月。谢谢你的概念。我明白了。很高兴知道你明白了逻辑。很高兴能帮上忙!