2017-02-21 24 views
0

Я надеюсь получить лучший способ сделать то, что я делаю. У меня есть несколько графиков, которые вы можете сделать и хотите сделать это наилучшим образом.mySQL с PHP для JSON для клиентской диаграммы

Я использую HighCharts, для которого требуется объект JSON для данных. Я использую Laravel в качестве задней части. Я отправляю 2 переменные (1 для меток & 1 для значений) на мой взгляд. Я вижу, что я могу сделать это в контроллере, но еще не начали

Мой Выпуск:

У меня есть эта таблица

|  date | printer | quant | 
| 2017-01-23 | JP1  | 20 | 
| 2017-01-23 | JP1  | 12 | 
| 2017-01-23 | JP2  | 18 | 
| 2017-01-24 | JP5  | 16 | 
| 2017-01-24 | JP1  | 8 | 
| 2017-01-26 | JP2  | 12 | 

Я думаю, что поражает все случаи, переменные принтеры, пропущенные дни , нужно суммировать количество в день и делать 0, если отсутствует. Вам нужен массив для каждого принтера, у которого у меня нет готового списка, потому что они сильно меняются. мои запросы будут иметь диапазон дат. Список принтеров будет отличаться для этого диапазона дат.

То, что я сделал это сделать запрос поворота MySql, который получает меня этот

[ 
{ 
"date": "2017-01-23", 
"sum": "1416", 
"JP4_3": "375", 
"JP4_1": "533", 
"JP4_2": "508", 
"B3": null, 
"A2": null 
}, 
{ 
"date": "2017-01-24", 
"sum": "2151", 
"JP4_3": "847", 
"JP4_1": "499", 
"JP4_2": "805", 
"B3": null, 
"A2": null 
}, 
{ 
"date": "2017-01-25", 
"sum": "2097", 
"JP4_3": "284", 
"JP4_1": "917", 
"JP4_2": "896", 
"B3": null, 
"A2": null 
} 
] 

я могу перебрать и захватить каждое свойство, чтобы сделать массив.

Мне интересно, есть ли лучший способ. Мне нужно получить ярлык и данные для работы с высокими графиками. Вот пример.

xAxis: { 
     categories: ['Apples', 'Bananas', 'Oranges'] 
    }, 
    series: [{ 
     name: 'Jane', 
     data: [1, 0, 4] 
    }, { 
     name: 'John', 
     data: [5, 7, 3] 
    }] 

Я знаю, что это сложный и долгий вопрос. Спасибо за любую помощь и руководство.

+0

Вероятно, не будет лучшего для форматирования ваших данных, кроме циклов и создания собственного массива, поскольку для высоких диаграмм нужен такой конкретный формат. Я говорю об этом после того, как интегрировал диаграммы в несколько разных проектов PHP/MySQL, причем пара была Laravel. Как правило, я прохожу через кеш данных диаграммы (либо в памяти, либо в таблице), чтобы часто обрабатывать большие наборы данных. – Samsquanch

+0

Привет @Samsquanch. вы могли бы привести пример этого. Что-то простое. Я прихожу из C# и долгое время с тех пор, как я коснулся php. Есть несколько функций, которые, я думаю, полезны здесь, что я не знаю, что нужно искать. – BrinkDaDrink

+0

Или, если вы знаете хороший ресурс для этого сенарио. Я нашел один, но они не показывают базу данных, так что это не так ясно. – BrinkDaDrink

ответ

0

Хотелось бы привести пример кода, как я это сделал. Вид боли, но от Самсванча, я думаю, это нормально. Это вызывает несколько запросов к базе данных, но для меня все еще много. Это использует laravel framework.

// Main chart info 
    $PrinterChartArray ["chart"] = array (
      'type' => 'line' 
    ); 
    $PrinterChartArray ["title"] = array (
      "text" => "Units per Printer" 
    ); 
    $PrinterChartArray ["credits"] = array (
      "enabled" => false 
    ); 
    $PrinterChartArray ["xAxis"] = array (
      "categories" => array() 
    ); 
    $PrinterChartArray ["tooltip"] = array (
      "valueSuffix" => " units" 
    ); 
    $PrinterChartArray ["yAxis"] = array (
      "title" => array (
        "text" => "Units" 
      ) 
    ); 

    // Get series Names 
    $printerNames = PrintJob::distinct()->select('printer') 
     ->whereDate('job_date', '>=', date($from)) 
     ->whereDate('job_date', '<=', date($to)) 
     ->get(); 

    // loop through series names and set series name and data for high charts 
    $chartSeries = []; 
    foreach($printerNames as $printer) 
    { 
     $printName = $printer->printer; 

     // Used where inside join so wouldnt miss dates 
     // used a calendar table with all dates to fill in missing dates 
     $data = PrintJob::select(DB::raw('COALESCE(SUM(print_jobs.quantity), 0) as sum'), DB::raw('calendar.datefield')) 
     ->rightJoin('calendar', function($join) use ($printName) 
     { 
      $join->on('print_jobs.job_date', '=', 'calendar.datefield') 
       ->where('printer', '=', $printName); 
     }) 
     ->whereDate('calendar.datefield', '>=', date($from)) 
     ->whereDate('calendar.datefield', '<=', date($to))   
     ->groupBy('calendar.datefield') 
     ->orderBy('calendar.datefield', 'ASC') 
     //->toSql(); 
     ->get(); 
     //->pluck('sum'); 

     // Needed to convert the returned value from a string value to a int value (apparently a driver issue with php and mysql) 
     foreach ($data as $key => $var) { 
      $data[$key] = (int)$var->sum; 
     } 
     // Add series to high chart 
     $chartSeries[] = array(
      "name" => $printName, 
      "data" => $data 
     ); 
    } 

    // Unessesary to use PrintJob for this but keeping similar to series to not mess up label 
    $chartLabel = PrintJob::select(DB::raw('calendar.datefield')) 
     ->rightJoin('calendar', function($join) use ($printName) 
     { 
      $join->on('print_jobs.job_date', '=', 'calendar.datefield'); 
     }) 
     ->whereDate('calendar.datefield', '>=', date($from)) 
     ->whereDate('calendar.datefield', '<=', date($to))   
     ->groupBy('calendar.datefield') 
     ->orderBy('calendar.datefield', 'ASC') 
     //->toSql(); --- This will show the actual query 
     //->get(); --- Will give array of objects 
     ->pluck('calendar.datefield'); // --- Will give a array of just the values wanted 

    $PrinterChartArray ["series"] = $chartSeries; 
    $PrinterChartArray ["xAxis"] = array (
      "categories" => $chartLabel 
    ); 
    //return $PrinterChartArray; -- used to see output without view 

    return view('print.charts', compact('jobsByDayLabels', 'jobsByDayValues', 'unitsByDayLabels', 'unitsByDayValues', 'PrinterChartArray')); 

И это частичный вид

<!-- Chart for Units by Printer by Day --> 
<div class="row"> 
    <div class="col-md-12 col-sm-12 col-xs-12"> 
     <div class="x_panel"> 
      <div id="printerUnitsByDay" style="min-width: 310px; height: 500px; margin: 0 auto"></div> 
     </div> 
    </div> 
</div> 

и это ниже сценарий на представлении

$(function() { 
    $('#printerUnitsByDay').highcharts({!! json_encode($PrinterChartArray) !!}) 
}); 
0

возвращение просто массив данных из Laravel и вида использования Балде

var data = JSON.parse('{!! json_encode($chartData) !!}'); 

Я использовал это в своем коде