#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();
}
}