2017-02-21 52 views
0

我希望能有更好的方式来做我正在做的事情。我有几个图表要做,并希望以最好的方式去做。mySQL with PHP to JSON for clientside chart

我正在使用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

格式化数据可能不会比循环和制作自己的数组更好,因为highcharts需要这种特定的格式。我在将highcharts集成到几个不同的PHP/MySQL项目后说这些,一对是Laravel。一般来说,我循环并缓存图表数据(无论是在内存中还是在表格中)以经常保存处理大型数据集。 – Samsquanch

+0

Hi @Samsquanch。你能否提供一个例子。简单一点。我来自C#,并且自从我触摸php以来已经很长时间了。有几种功能我认为在这里是有帮助的,我不知道寻找。 – BrinkDaDrink

+0

或者如果你知道这个senario的好资源。我找到了一个,但他们不显示数据库,所以它不那么清楚。 – BrinkDaDrink

回答

0

想给我一个代码示例,我是如何做到这一点的。有种痛苦,但来自Samsquanch我想这是正常的。这可以做几个数据库调用,但对我来说仍然很快。这是使用laravel框架。

// 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) !!}'); 

我在我的代码中使用了这个