背景
レポート画面を作ろうとしていて(※1)、DBから日付ごとに集計したデータを取得した。
しかし、データのない日付は存在しない作りになっていた。
※1: 画面では対象年月を選べて、選んだ年月のデータが日別で表示される感じ
####DBの取得情報そのまま表示
日付 | 売上件数 | 売上金額 |
---|---|---|
2015-12-01 | 3 | 300 |
2015-12-04 | 4 | 400 |
2015-12-05 | 3 | 300 |
... | ... | ... |
2015-12-30 | 3 | 300 |
2015-12-31 | 3 | 300 |
みたいな感じでデータがあるとこだけ出力される。
####ほしいイメージ
日付 | 売上件数 | 売上金額 |
---|---|---|
2015-12-01 | 3 | 300 |
2015-12-02 | 0 | 0 |
2015-12-03 | 0 | 0 |
2015-12-04 | 4 | 400 |
2015-12-05 | 3 | 300 |
... | ... | ... |
2015-12-30 | 3 | 300 |
2015-12-31 | 3 | 300 |
売上がない日は0で出力したい。
解決策
DateIntervalを使って対象月の全日付を取得する
php
$date = '2015-12'; //本来はformからのリクエストなので動的
$begin = new DateTime(date('Y-m-d', strtotime('first day of '. $date)));
$end = new Datetime(date('Y-m-d', strtotime('first day of next month '. $date)));
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
foreach($daterange as $date){
echo $date->format("Y-m-d") . "\n";
}
output
2015-12-01
2015-12-02
2015-12-03
2015-12-04
2015-12-05
2015-12-06
2015-12-07
2015-12-08
2015-12-09
2015-12-10
2015-12-11
2015-12-12
2015-12-13
2015-12-14
2015-12-15
2015-12-16
2015-12-17
2015-12-18
2015-12-19
2015-12-20
2015-12-21
2015-12-22
2015-12-23
2015-12-24
2015-12-25
2015-12-26
2015-12-27
2015-12-28
2015-12-29
2015-12-30
2015-12-31
あとはDBのデータと付き合わせて出力すれば、欲しいものは手に入る。
参考
余談
例として使ったような売上げデータの場合は注文tableと集計結果tableを分けて作って、レポートは集計結果tableを参照すべきだと思う。
今回は諸事情で注文テーブル(みたいな)tableを利用したので、こんな風な処理が必要になった。