如何从时间戳开始按年份对分组对象进行排序,然后按月对分组对象进行排序?

时间:2019-02-06 18:36:22

标签: php laravel php-carbon

我有几个从发票类实例化的对象。

每个属性都有 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')并得到相同的结果。它不会给出错误,但也不会带来希望的结果。即使这样做,也只能按年份对它们进行排序。在那年内,几个月可能仍然是错误的。

1 个答案:

答案 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,您也可以使用。