【问题标题】:Eloquent - group by "from date" to "to date" with a one day intervalEloquent - 按“从日期”到“至今”分组,间隔为 1 天
【发布时间】:2017-02-10 03:24:56
【问题描述】:
我有一个 Reservation 模型,它有 date_from 和 date_to 字段。
如何按一天的间隔对预订进行分组,以便知道在特定日期有多少预订处于活动状态?
示例
Reservation::groupBy('...')->get()
输出:
reservations
==================
qty | date
------------------
3 | 2000-01-01
5 | 2000-01-02
2 | 2000-01-03
...
【问题讨论】:
标签:
mysql
laravel
laravel-5
eloquent
laravel-query-builder
【解决方案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) && !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) && $reservation->date_to->endOfDay()->gte($carbon_date));
})
->count();
}
}