如何使用laravel获取连续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

我正在开发一个报告系统,我想获取连续六(6)个月没有报告的用户。我如何做到这一点

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

$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个月。谢谢你的概念。我明白了。很高兴知道你明白了逻辑。很高兴能帮上忙!