2017-02-21 53 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) !!}'); 

我在我的代碼中使用了這個