Как получить пользователей, которые не имеют отчетов в течение 6 месяцев подряд, используя laravel? - PullRequest
1 голос
/ 11 апреля 2019

Я разрабатываю систему отчетов и хочу получить пользователей, которые не отчитывались в течение шести (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);
    }

});

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Что я сделаю, так это то, что я буду создавать цикл в месяц на основе начальной и конечной даты, а затем проверять, не было ли у него отчета за этот месяц.Если у него нет отчета за этот месяц, я увеличу счетчик, а если этот счетчик достигнет 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
0 голосов
/ 11 апреля 2019

Я изменил запрос из этого ответа

Я считаю, что запрос может быть написан чище.Я позволю вам сделать это, если вы хотите.

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 дополнительными полями: date_start ; date_end , day_gap и month_gap

Если вы хотите, чтобы пользователи имели месячный разрыв в 6 месяцев, вы можете сделать это:

App\User::select('*')
    ->from(\DB::raw("..."))
    ->where('month_gap', '>=', 6)
    ->get();
0 голосов
/ 11 апреля 2019

Вы должны найти отдельных пользователей, которые сообщают о шести (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...