我正在尝试建立一个小的统计模块。 我正在寻找一个数组,其中包含每个月“事件”表中事件的数量。 通过下面的查询,我可以得到结果,但前提是当月有结果。如果没有,则不会出现。 我的要求:
$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)的数组或集合
答案 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;