2017-06-28 70 views
2

使用Chart.js顯示每個月的預訂數量。這是我的查詢。它工作正常。 我的問題是,如果一個月內沒有預訂,那麼它不顯示任何東西。沒有零值。在圖表上我得到這樣如何在Laravel中計數爲零時獲得記錄

  • 值1月23日
  • 月34
  • 4月23日
  • 5月25日
  • 月42

三月和六月顯示在圖表..我怎麼能得到價值零月,沒有預訂..

$graph = DB::table('bookings') 
    ->select(DB::raw('MONTHNAME(created_at) as month'), DB::raw("DATE_FORMAT(created_At,'%M %Y') as monthNum"), DB::raw('count(*) as totalbook')) 
    ->groupBy('monthNum') 
    ->orderBy('created_at', 'asc') 
    ->get(); 

要獲得個月,`

@foreach ($graph as $dat) 
       "{!! $dat->monthNum !!}", 
       @endforeach` 

並獲得預約號

@foreach ($graph as $dat) 
       {!! $dat->totalbook !!}, 
       @endforeach 
+2

我不確定使用Laravel,但一般來說使用SQL,您可以添加'UNION ALL 0'來顯示一個值,否則會被忽略爲空:https://www.sqlservercentral.com/Forums/ 790871 /返回一行與常量,甚至如果查詢空白#bm790946,雖然我會認爲這比解決方案更深入 – ctwheels

+0

你不會按年限制查詢嗎?實際上我實際上是 –

+0

。 DATE_FORMAT(created_At,'%M%Y')爲monthNum ..我將更新問題 – stoneshak

回答

1

MySQL不會填寫無法使用的月份,它只會根據您的可用數據進行分組,然後爲您提供這些結果。

你可以做的是使用DatePeriod和Laravel的Collection類:

$results = DB::table('bookings') 
    ->selectRaw("DATE_FORMAT(created_At,'%Y-%m-01') as monthNum, count(*) as totalbook") 
    ->orderBy('monthNum') 
    ->groupBy('monthNum') 
    ->get(); 

$results = collect($results)->keyBy('monthNum')->map(function ($item) { 
    $item->monthNum = \Carbon\Carbon::parse($item->monthNum); 

    return $item; 
}); 

$periods = new DatePeriod($results->min('monthNum'), \Carbon\CarbonInterval::month(), $results->max('monthNum')->addMonth()); 

$graph = array_map(function ($period) use ($results) { 

    $month = $period->format('Y-m-d'); 

    return (object)[ 
     'monthNum' => $period->format('M Y'), 
     'totalbook' => $results->has($month) ? $results->get($month)->totalbook : 0, 
    ]; 

}, iterator_to_array($periods)); 

請注意我在查詢更新monthNum,因爲它會在稍後重新格式化。

此外,您應該需要使用刀片原始標籤({!! !!}),因爲{{ $dat->totalbook }}應該工作得很好。

希望這會有所幫助!

+0

調用成員函數keyBy()array 我得到了這個error.my laravel版本是5.1.46(LTS) – stoneshak

+0

@stoneshak 5.1 ...由於某種原因,我以爲你在5.4。我會用更合適的更新我的答案。 :) –

+0

非常感謝你的伴侶。除了沒有顯示上個月的數據之外,它的工作完美。改變數據庫中的數據庫,以確保但不幸的是它不顯示上個月:( – stoneshak

1

你必須設置爲零時,有計數任何記錄。

更改您的查詢是這樣的:

$graph = DB::table('bookings') 
->select(DB::raw('MONTHNAME(created_at) as month'), 
     DB::raw("DATE_FORMAT(created_At,'%M') as monthNum"),  
     DB::raw('ifnull(count(*),0) as totalbook')) 
->groupBy('monthNum') 
->orderBy('created_at', 'asc') 
->get(); 

希望你能理解。

+0

感謝您的付出。我把它完全一樣..仍然正常工作,但不幸的是,如果當月沒有預訂,它不會給出零值。 – stoneshak

+0

@stoneshak我覺得'count(*)'有問題,所以請用'count(id)'嘗試它會起作用。 –

相關問題