Отображение отчета о данных за последние 24 часа в Chart.Js

#javascript #php #laravel #loops #chart.js

#javascript #php #laravel #циклы #chart.js

Вопрос:

Отображение отчета о данных за последние 24 часа .. Если отчет не был создан в течение часа, по умолчанию вставляется ноль.

Мой запрос:

  $dayReport = Report::select(DB::raw("HOUR(created_at) as hourNo,SUM(site_id) as count"))
                        ->where('site_id',$site->id)
                        ->whereDate('created_at','>=', CarbonCarbon::now()->subHours(24))
                        ->orderBy("created_at")
                        ->groupBy(DB::raw("hour(created_at)"))
                        ->get()
                        ->toArray();
  

Выводится следующим образом:

   data: [0,2,4,2,2,0,0,0,0,0,0,0,0,0,0,5,6,7,0,8,0,6,10,22]
  

Мой вывод:

   data: [2,4,2,2]
  

Это данные диаграммы Js в Javascript, значение по умолчанию 0, в течение 1 часа отчет не создается.

Заранее благодарю вас…

Комментарии:

1. В этом примере вам следует избегать groupBy инструкции. Group by не будет принимать все 0 , и если имеется несколько записей по 2, 4, то потребуется только одна запись. Также, пожалуйста, присвоите столбцу hour значение по умолчанию 0 . Поэтому, когда запись будет вставлена без чего-либо, по умолчанию она будет равна нулю.

2. не могли бы вы, пожалуйста, поделиться своей структурой таблицы?

3. Запуск цикла… Временная метка таймера за последние 24 часа@MayankDudakiya

4. Запуск цикла… Временная метка таймера за последние 24 часа@Shibon

5. Структура таблицы не используется..@ Shibon

Ответ №1:

Из запроса вы получите час и сумму, если это так .. вы можете попробовать приведенный ниже код

 $results = array(array('hour' => 2, 'count' => 3), array('hour' => 3, 'count' => 3), array('hour' => 13, 'count' => 10));
$hours = array(1,2,3,4,5,6,7,8,9,10,11,12,13); //up to 24
$finalResult = [];
 foreach($hours as $hour){
    $hourSearch = array_search($hour, array_column($results, 'hour')); 
   if(is_numeric($hourSearch)) {
    //  array_push($finalResult, $results[$hourSearch]);
    array_push($finalResult,$results[$hourSearch]['count']);
   } else {
   //   $data['hour'] = $hour;
   //  $data['count'] = 0;
   //array_push($finalResult, $data);
    array_push($finalResult,0);
  }
}

echo json_encode($finalResult);
  

http://sandbox.onlinephpfunctions.com/code/d3c04e3b58b01b9f70652a3398379d867453b0ea

Ответ №2:

Кажется, я не совсем понимаю ваш вопрос, но использование carbon очень помогло бы, когда дело доходит до работы с датами, это сократило бы ваш код на много строк. `$now = Carbon Carbon::now; $ hoursBefore = $now-> Субботы (1);

$reports = Report::where(‘site_id’, $site-> id)-> whereBetween(‘created_at’, [$hoursBefore, $now])-> get()-> toArray(); `

Я надеюсь, что это поможет. Спасибо, удачи и удачного кодирования …. 🙂

Комментарии:

1. какой ответ вы получаете?

2. [2,2,4] результат получения

Ответ №3:

я прочитал ответ от @Shibon, и он выглядит хорошо

у меня такая же ситуация при создании диаграмм на основеhttps://github.com/ConsoleTVs/Charts

Итак, я создал функцию для этого

Вот мой массив только со значениями, но мне нужно установить остальные значения равными нулю, поэтому я создал свою собственную функцию

  $arrayWithValues = 
                        [
                            '02' => '20',
                            '09' => '45',
                            '15' => '68',
                            '21' => '28'
                        ];

 $defaultEmptyArray = [
                        '00' => '0',
                        '01' => '0',
                        '02' => '0',
                        '03' => '0',
                        '04' => '0',
                        '05' => '0',
                        '06' => '0',
                        '07' => '0',
                        '08' => '0',
                        '09' => '0',
                        '10' => '0',
                        '11' => '0',
                        '12' => '0',
                        '13' => '0',
                        '14' => '0',
                        '15' => '0',
                        '16' => '0',
                        '17' => '0',
                        '18' => '0',
                        '19' => '0',
                        '20' => '0',
                        '21' => '0',
                        '22' => '0',
                        '23' => '0',
                    ];
  

Теперь нам нужно заменить только тот массив, который имеет значение, и я написал свою собственную функцию

 function setUnsettedArray($actulHourWithValue = [] ,$defaultEmptyArray = [])
{
    $arraNotExists = [];

     foreach ($defaultEmptyArray as $defKey => $defValue) 
        {
            if (array_key_exists($defKey, $actulHourWithValue)) 
            {
                $arrayEXists[] = [$defKey => $actulHourWithValue[$defKey]];
            }
            elseif (!array_key_exists($defKey, $actulHourWithValue)) 
            {
                $arraNotExists[] =  [$defKey => $defValue];
            }
        }

        $newArray = array_merge($arraNotExists,$arrayEXists);


        foreach ($newArray as $newKey => $newValue) 
        {
            $keys[] = $newKey;
            foreach ($newValue as $key => $value) 
            {
                $allKesy[] = $key;
                $allValues[] = $value;
            }

        }

        $finalArray = array_combine($allKesy,$allValues);
        ksort($finalArray);

        return $finalArray;    
}
  

и попытайтесь передать массив как print_r(setUnsettedArray($arrayWithValues,$defaultEmptyArray));

и вот скрипка для этого

http://phpfiddle.org/main/code/sfq3-adyn

Я ОТРЕДАКТИРОВАЛ setUnsettedArray функцию

 function setUnsettedArray(array $arrayWithValues ,array $defaultArray)
{
        $finalArray = $arrayWithValues $defaultArray;
        ksort($finalArray);
        return $finalArray;    
}
  

И я видел ваш запрос, и это не очень хорошо

Итак, попробуйте это

 $lastTwentyFour =  Report::where('site_id','=',$site->id)
                        ->whereDate('created_at', '=', Carbon::now()->subHours(24))
                        ->orderBy('created_at')
                        ->get()
                        ->groupBy(function($date) 
                                    {
                                    return Carbon::parse($date->created_at)->format('H');
                                    }
                                );    
  

и вы можете рассчитывать сбор за каждый час как

 foreach ($lastTwentyFour as $newGroupByKey => $newGroupByValue) 
        {
            $eachHour[] = $newGroupByKey;
            $eachHourCount[] = $newGroupByValue->count();
        }


$actulHourWithValue = array_combine($eachHour,$eachHourCount);
  

Комментарии:

1. например, в 1 час ночи в not report создается значение по умолчанию 0, созданное в chartjs. в 2 часа ночи отчет создан 16 в chart js … отчет за 24 часа отображается в chartjs @Manojkiran.A

2. вы хотите за 12 часов??

3. не могли бы вы, пожалуйста, dd() ввести $lastTwentyFour переменную и показать результат

4. результат таков: [0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,7,0,0,0,3,0,0,1,4] пример результата… Мой вывод, как правило, отличается от вывода..

5. пожалуйста, посмотрите скриншот, прикрепленный здесь i.imgur.com/m1jtQRN.png в этом число 16 обозначает 4PM , получаете ли вы подобное. Пожалуйста, приложите скриншот