Eloquent - 按“从日期”到“至今”分组,间隔为 1 天

Posted

技术标签:

【中文标题】Eloquent - 按“从日期”到“至今”分组,间隔为 1 天【英文标题】:Eloquent - group by "from date" to "to date" with a one day interval 【发布时间】:2017-02-10 03:24:56 【问题描述】:

我有一个 Reservation 模型,它有 date_fromdate_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) && !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();
    

【讨论】:

以上是关于Eloquent - 按“从日期”到“至今”分组,间隔为 1 天的主要内容,如果未能解决你的问题,请参考以下文章

按 id 分组 Laravel Eloquent 枢轴值

Eloquent 获取按日期分组的最后一条记录

如何使用sql从日期字段按月分组

如何使用 Python/Pandas 从日期字段按月分组

Eloquent - 按月、年和分页分组

Laravel Eloquent,按月/年分组