我有几个从发票类实例化的对象。
每个属性都有 sorting_date (时间戳)。
我想按 年和月 对所有发票进行分组,并在列表中显示月份,以最新的顺序显示,然后按照时间顺序显示其余的月份。最新到最旧。
2019年2月
2019年1月
2018年12月
2019年1月
2018年12月
2019年2月
$months = Invoice::where("user_id", $id)->pluck('sorting_date')->groupBy('month', 'year');
$months = $months->sortBy('year');
在修补程序 $ months 中,如下所示(仅以月为键):
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('year')中写什么都没关系。我什至可以写 sortBy('banana')并得到相同的结果。它不会给出错误,但也不会带来希望的结果。即使这样做,也只能按年份对它们进行排序。在那年内,几个月可能仍然是错误的。
答案 0 :(得分:0)
您可以在SQL中完成所有这些操作。您不必使用“集合”来操纵结果集。
因此,使用查询生成器(或Eloquent),您可以执行以下操作:
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,您也可以使用。