Как считать и группировать по месяцам или годам с нулевым месяцем - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь настроить небольшой статистический модуль.Я ищу массив, содержащий для каждого месяца количество событий в моей «вечерней» таблице.С запросом ниже я получаю результаты, но только если есть результат в месяце.Если нет, он не появляется.Мой запрос:

$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 голосов
/ 27 апреля 2019

Мне понравился ответ Клаудио, но я бы попробовал другой способ.

Сначала я получаю коллекцию своих событий:

$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/

0 голосов
/ 30 апреля 2019

Спасибо тебе. С этими 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;
0 голосов
/ 27 апреля 2019

Самым простым делом может быть предвидеть месяцы и конфликтовать с коллекцией, если ее нет, добавить ее.

Для простоты вы можете применить метод keyby () ( документация )

->keyBy('month')

в вашей коллекции.

и затем выполните foreach так:

$months =["January", "February", ....]; 
foreach ($months as $month){
  if (!isset($data[$month])){
    $data[$month]['id'] = 0;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...