2016-01-22 70 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

相关问题