如何分组的对象主要是一年,其次由时间戳每月排序?

问题描述 投票:0回答:1

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

每个具有属性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(“香蕉”),并给了我同样的结果。它不给一个错误,但也没有希望的结果。即使做了也只是用了一年它们排序。这一年里面仍然月份可能是错误的。

php laravel php-carbon
1个回答
0
投票

你可以做这一切的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,你也可以玩的。

© www.soinside.com 2019 - 2024. All rights reserved.