Laravel красноречивый группировка по дате, возвращать также пустые / нулевые строки - PullRequest
1 голос
/ 21 октября 2019

Я успешно группирую по дате и времени (каждый час) следующим образом:

$adminActivities = Activity::whereBetween('created_at', [$data->from_date, $data->to_date])->where('user_id', $data->admin_id)->get()
->groupBy(function($date) {
    return Carbon::parse($date->created_at)->format('Y-m-d H'); 
});

Пример результатов, которые я получаю в атм. за 1 день:

2019-10-18 10: [{…}]
2019-10-18 15: (15) [{…}, ...]

В примере мы видим, что он нашел 1 результат за 10 часов и 15 результатов за 15 часов.

Я использую результаты для созданияграфик с графиком js.

Мне нужны все часы дня, вот что я хочу:

2019-10-18 00: []
2019-10-18 01: []
2019-10-18 02: []
2019-10-18 03: []
...
2019-10-18 10: [{…}]
2019-10-18 15: (15) [{…}, ...]
...
2019-10-18 23: []

Что мне делать, чтобызаставить возвращать также нулевые результаты для каждого часа?

Я пробовал другой синтаксис, но результаты те же:

$adminActivities = Activity::whereBetween('created_at', [$data->from_date, $data->to_date])->where('user_id', $data->admin_id)
->selectRaw("COUNT(*) views, DATE_FORMAT(created_at, '%Y-%m-%d %H') date")->groupBy('date')->get(); 

1 Ответ

2 голосов
/ 21 октября 2019

Возможно, есть более элегантное решение, но вы можете создать массив, содержащий все желаемые часы, и заполнить их результатами вашего запроса, например:

 $start = Carbon::create($data->from_date);
 $end = Carbon::create($data->to_date);

 $adminActivities = Activity::whereBetween(
     'created_at', [$start->toDateTimeString(), $end->toDateTimeString()])
     ->where('user_id', $data->admin_id)->get()
     ->groupBy(function($date) {
         return Carbon::parse($date->created_at)->format('Y-m-d H'); 
     });

 $hours = [];   

 /*for ($i = 0; $i < $start->diffInHours($end); $i++) 
 {  
     $key = $start->format('Y-m-d H');
     $hours[$key] = isset($adminActivities[$key]) ? $adminActivities[$key]->toArray() : [];
     $start->addHour();
 }*/

 dd($hours);

Это работает для @Roman:

$i = 0;
while ($i < 25) {
    $key = $start->format('Y-m-d ' . $i);
    $hours[$key] = isset($adminActivities[$key]) ? $adminActivities[$key]->toArray() : [];
    $i += 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...