Eloquent — группировать по «от даты» до «на сегодняшний день» с интервалом в один день

#mysql #laravel #laravel-5 #eloquent #laravel-query-builder

#mysql #laravel #laravel-5 #красноречивый #laravel-конструктор запросов

Вопрос:

У меня есть Reservation модель, в которой есть date_from date_to поля и.

Как можно сгруппировать бронирования с интервалом в один день, чтобы можно было узнать, сколько из них активно на определенную дату?

Пример

 Reservation::groupBy('...')->get()
  

Вывод:

 reservations
==================
qty | date
------------------
3   | 2000-01-01
5   | 2000-01-02
2   | 2000-01-03
...
  

Ответ №1:

Сначала добавьте «date_from» и «date_to» в массив $ dates в модели

protected $dates = ['date_from', 'date_to'];

Затем

 $min_date = Reservation::select(DB::raw('MIN(date_from) as min'))->first();
$max_date = Reservation::select(DB::raw('MIN(date_to) as max'))->first();
$data = [];

if (!is_null($min_date) amp;amp; !is_null($max_date)) {
    $daterange = new DatePeriod(DateTime::createFromFormat('Y-m-d H:i:s', $min_date->min), new DateInterval('P1D') ,DateTime::createFromFormat('Y-m-d H:i:s', $max_date->max));

    $reservations = Reservation::all();
    foreach ($daterange as $date) {
        $data[$date->format('Y-m-d')] = $reservations->filter(function($reservation) use($date) {
            $carbon_date = Carbon::instance($date)->endOfDay();
            return ($reservation->date_from->startOfDay()->lte($carbon_date) amp;amp; $reservation->date_to->endOfDay()->gte($carbon_date));
        })
        ->count();
    }
}