2016-01-22 67 views
0

我試圖爲每個日期中獲得價值,即使沒有交易:Laravel讓每一個日期值對每個用戶的

$transaction = Transaction::whereBetween(DB::raw('DATE(created_at)'), ['2015-12-01', '2016-12-31']) 
       ->where('vendor_id', $row) 
       ->groupBy('vendor_id', DB::raw('DATE(created_at)')) 
       ->selectRaw('FLOOR(SUM(amount)) as total, DATE(created_at) as date') 
       ->orderBy('created_at')->get(); 

return $transaction; 

結果我得到:

[{"total":"81739","date":"2015-12-22"},{"total":"82912","date":"2015-12-26"},{"total":"55912","date":"2015-12-27"},{"total":"55599","date":"2015-12-30"},{"total":"77626","date":"2015-12-31"}]; 

我怎樣才能得到價值每一個日期,如果它沒有值插入0 ?.

謝謝。

+0

嘗試的每一個正確的日期。 –

+0

如果刪除groupby語句,它將變成1值。謝謝 – ssuhat

回答

1

更新:增加了新的解決方案(不加入)

的想法很簡單:如果你今天沒有交易,今天的日期是不是在您的交易表。

解決辦法也很簡單:你的每一個日子儲存像這樣:

天天跑在00:00:00,把一個空的交易一個cronjob。因此,您可以在事務表中獲取每個日期,而無需連接到另一個表。

小心:只有當某個日期存在「真實」交易時,才應刪除「虛假」(空)交易。

替代1

  • 創建日期(以iddate),例如表從2015年1月1日至2025年12月31日
  • 選擇日期和左連接到事務表

實施例的查詢:

SELECT * FROM dates d LEFT JOIN transactions t ON t.date_id = d.id 

不是將日期存儲在事務表中,而是將外鍵存儲到日期表中。

備選方案2:

  • 創建日期表(附有iddate
  • 運行間隔00:00:00那插入當前日期
  • 一個cronjob選擇日期和左加入交易表

備選3:

  • 通過刪除GROUPBY語句生成與PHP的DateInterval日期範圍
  • 鏈接從您的交易表中的記錄的範圍
+0

你的意思是做'tmp table'。所以每次我查詢插入到它並獲得價值? – ssuhat

+0

要解決日期範圍中的'洞':將日期存儲在日期表中,填入。就個人而言,我更喜歡替代方案1.每天00:00:00你插入今天的日期。您可以從日期表中選擇想要的時間段,並將其連接到事務處理表。因此,您可以獲得該時期的每個日期,並在存在交易時獲得交易。 – schellingerht

+0

如果我補充說它會很多。我有2000個供應商,而且我需要的每個事務'user_id'都是用戶表的外鍵。但是我會考慮這種方法並嘗試查看結果。而created_at的事務列類型是datetime。我需要時間進行另一個查詢 – ssuhat

相關問題