我从类实例化的发票几个对象。
每个具有属性sorting_date(时间戳)。
我想组按年份和月份的所有发票,并在列表中使用最新的第一个,然后按时间顺序如下,其余显示个月。最新到最旧。
2019二月 2019一月 2018十二月
2019一月 2018十二月 2019二月
$months = Invoice::where("user_id", $id)->pluck('sorting_date')->groupBy('month', 'year');
$months = $months->sortBy('year');
在鼓捣$几个月看起来是这样的上述操作(只有个月键)后:
Illuminate\Support\Collection {#3069
all: [
1 => Illuminate\Support\Collection {#3066
all: [
Illuminate\Support\Carbon @1546796483 {#3052
date: 2019-01-06 17:41:23.0 UTC (+00:00),
},
],
},
12 => Illuminate\Support\Collection {#3043
all: [
1 => Illuminate\Support\Carbon @1544118083 {#3060
date: 2018-12-06 17:41:23.0 UTC (+00:00),
},
],
},
2 => Illuminate\Support\Collection {#3040
all: [
2 => Illuminate\Support\Carbon @1549474883 {#3058
date: 2019-02-06 17:41:23.0 UTC (+00:00),
},
3 => Illuminate\Support\Carbon @1549474883 {#3033
date: 2019-02-06 17:41:23.0 UTC (+00:00),
},
],
},
],
}
据我所知,我的代码不能正常工作。不要紧,我在sortBy(“年”)编写。我甚至可以写sortBy(“香蕉”),并给了我同样的结果。它不给一个错误,但也没有希望的结果。即使做了也只是用了一年它们排序。这一年里面仍然月份可能是错误的。
你可以做这一切的SQL。你不必来操纵你的结果与收藏集。
因此,使用查询生成器(伶牙俐齿的),你可以这样做:
return DB::table('invoices')
->selectRaw('YEAR(sorting_date) AS year, MONTHNAME(sorting_date) month, COUNT(*)')
->groupby('year','month')
->orderBy('year', 'desc')
->orderByRaw('MONTH(sorting_date) DESC')
->get();
这里有一个example,你也可以玩的。