Posts Laravel Eloquent 时间日期比较和分组
Post
Cancel

Laravel Eloquent 时间日期比较和分组

前言

最近在做一个订单日收入模块的时候,涉及到日期比较和分组查询的问题,经过一番探索,总算是找到了解决方法,特地记录一下,以方便日后翻阅。

正文

假设我们有一个orders表,数据如下:

idamoutcreated_atupdated_at
11002019-01-012019-01-01
21002019-01-012019-01-01
32002019-01-022019-01-02
42002019-01-022019-01-02
53002019-01-032019-01-03

然后我们有以下需求:

  1. 获取每天的收入情况。
  2. 查询某个日期段(或者是某天)的订单,并显示各天的收入情况。

获取每天的收入情况

其实这个问题的难点就在于如何按照日期来分组,我的解决方案如下:

1
2
3
4
5
6
7
8
9
10
11
public function getIncome(Request $request){
	$list = Order::query() // 这里可以用 where 先限制一些条件
                ->select(
                    DB::raw('Date(created_at) as date'),
                    DB::raw('COUNT(id) as count'),
                    DB::raw('SUM(amount) as income')
                );
    return $list->groupBy('date')
                ->orderBy('date', 'DESC')
                ->get();
}

返回结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
  {
    "date": "2019-01-03",
    "count": 1,
    "income": 300
  },
  {
    "date": "2019-01-02",
    "count": 2,
    "income": 400
  },
  {
    "date": "2019-01-01",
    "count": 2,
    "income": 200
  }
]

获取某个日期段的各天收入情况

这里就涉及到日期比较了,因此我们可以使用whereDate方法。

whereDate方法只能在 Laravel 5.0之后才能使用。

关于更多类似日期方法可以访问: 链接

我们需要接受两个参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function getIncome(Request $request){
	$list = Order::query() // 这里可以用 where 先限制一些条件
                ->select(
                    DB::raw('Date(created_at) as date'),
                    DB::raw('COUNT(id) as count'),
                    DB::raw('SUM(amount) as income')
                );
    if ($request->has('date')){
            $date = $request->input('date');
            $list = $list->whereDate('created_at','>=',$date[0])
                         ->whereDate('created_at','<=',$date[1]);
    }
    return $list->groupBy('date')
                ->orderBy('date', 'DESC')
                ->get();
}

返回结果:

1
2
3
4
5
6
7
8
9
10
11
12
[
  {
    "date": "2019-01-02",
    "count": 2,
    "income": 400
  },
  {
    "date": "2019-01-01",
    "count": 2,
    "income": 200
  }
]

其他问题

获取当天

获取当天可以这样:

1
Order->whereDate('created_at', date("Y-m-d"));

满足其他条件

假设我们还要当天总收入超过多少才行,我们可以这样:

1
$list = $list->havingRaw('SUM(amount) ' . '>' . ' ' . $minAmount);

或者需要当订单数量超过多少:

1
$list = $list->havingRaw('COUNT(id) ' . '>' . ' ' . $minCount);

写在最后

当然,我这个可能不是最佳方案,如果您有更好的方法,还请多多指教。

This post is licensed under CC BY 4.0 by the author.

分享一些好用的网站

分享一些好用的 Chrome 扩展

Loading comments from Disqus ...