如何按月份或年份(月份为零)进行计数和分组

时间:2019-04-27 17:04:39

标签: php sql laravel laravel-5

我正在尝试建立一个小的统计模块。 我正在寻找一个数组,其中包含每个月“事件”表中事件的数量。 通过下面的查询,我可以得到结果,但前提是当月有结果。如果没有,则不会出现。 我的要求:

$data = DB::table("evenements")
        ->select(DB::raw('EXTRACT(MONTH FROM datedevenement) AS month, COUNT(id) as id'),
         DB::raw('ifnull(count(id),0) as id')
        )
         ->where('typeevenement_id', '1')
        ->whereYear('datedevenement', Carbon::now()->year)
        ->orderBy('datedevenement')

        ->groupBy(DB::raw('month'))
        ->get();



    return $data;

我的餐桌:

id | datedevenement | typeevenement_id

我了解我的请求无法发明不存在的月份。我想知道碳或laravel是否没有按月份或年份连续列出的内容。

结果必须是具有monthORyears-> count(evenement)的数组或集合

3 个答案:

答案 0 :(得分:0)

最简单的方法是每隔几个月进行一次搜索,并将其与集合冲突(如果不存在,则添加它)。

为简单起见,您可以应用keyby()(documentation)方法

->keyBy('month')

在您的收藏中。

然后执行如下所示的foreach:

$months =["January", "February", ....]; 
foreach ($months as $month){
  if (!isset($data[$month])){
    $data[$month]['id'] = 0;
  }
}

答案 1 :(得分:0)

我喜欢克劳迪奥的回答,但我会尝试另一种方式。

首先,我收集了我的事件:

$temp = $model
             ->orderBy("date_field")
             ->get()
             ->groupBy(function($query) { 
                 return Carbon::parse($query->date_field)
                               ->format("m");
             })

现在,您有一个按月分组的集合。

我的第二步是像这样对集合$temp进行迭代:

$result = new array();
$temp->each(function($query) use (&$result) {
    $result["count"] = $query->count();
    $result["data"] = $query;
});

现在,您有了一个数组,其中包含一个用于浏览数据的集合以及一个计数器,该计数器知道每月将实现多少事件。当您没有活动时,有必要对前端进行消毒。

希望对您有帮助。

参考: https://laraveldaily.com/laravel-group-query-result-by-day-month-year/

答案 2 :(得分:0)

谢谢。 有了这2个答案和一个小建议,我就得出了这个解决方案(我已经添加了一些东西,以当前月份的订单作为起点):

$monthly_uploaded_product = Evenement::select(DB::raw('COUNT(id) as total, EXTRACT(MONTH FROM datedevenement) AS month')
    )
        ->where('typeevenement_id', '1')
        ->wheredate('datedevenement', '>=', Carbon::now()->lastOfMonth()->subyears(1))
       /// ->whereYear('datedevenement', Carbon::now()->year)
       ->groupBy(DB::raw('month'))

        ->get();

    $mois  = ["janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre"];

    foreach ($mois as $mois99) {
        $arriveeparmoisrefuge[]= array(
            'mois' => $mois99,
            'total' => '0'
        );

    }
        foreach ($monthly_uploaded_product as $key) {
                $arriveeparmoisrefuge[$key->month - 1]['total'] = $key->total;//update each month with the total value
        }
    $sorted = collect($arriveeparmoisrefuge)->sortBy(function ($count, $month) {
        $currentMonth = (int) \Carbon\Carbon::now()->month;

        return ($month + (13 - $currentMonth - 1)) % 12;
    });

    return  $sorted;
相关问题