我尝试创建一个Eloquent查询,该查询获取每个不同日期发布的帖子总数,如果缺少日期,则将其填入值为零。
例如,如果我的表格如下:
+----+---------------------+
| id | date |
+----+---------------------+
| 1 | 2015-01-01 00:00:00 |
| 2 | 2015-01-01 01:53:18 |
| 3 | 2015-01-01 02:41:26 |
| 4 | 2015-01-02 12:51:01 |
| 5 | 2015-01-05 08:24:12 |
+----+---------------------+
这将输出:
2015-01-01 : 3
2015-01-02 : 1
2015-01-05 : 1
但请注意,缺少03-04
天。我如何包含这些日期,但是给它们0
这样的值,以便我得到如下输出:
2015-01-01 : 3
2015-01-02 : 1
2015-01-03 : 0
2015-01-04 : 0
2015-01-05 : 1
这是我当前的查询:
$posts = Post::select(array(
DB::raw('DATE(`created_at`) as `date`'),
DB::raw('COUNT(*)as `count`')
))
->where('created_at', '>', Carbon::today()->subWeek())
->groupBy('date')
->orderBy('date', 'DESC')
->lists('count', 'date');
谢谢!
答案 0 :(得分:2)
在你的SQL结果中,你可以在你的行中生成一些“假数据”,但你不能生成“假行”,加入一些“假(临时) - 表”。 在你的情况下,更容易在sql-result周围应用一些逻辑。
用以下代码替换您的代码:
$order = 'DESC';
$endDate = Carbon::today();
$startDate = Carbon::today()->subWeek();
$dateInc = ($order == 'DESC') ? -1 : 1;
$dateCycleHolder = clone ($dateInc > 0 ? $startDate : $endDate);
$dateCycleEnd = clone ($dateInc > 0 ? $endDate : $startDate);
$posts = Post::select(array(
DB::raw('DATE(`created_at`) as `date`'),
DB::raw('COUNT(*)as `count`')
))
->where('created_at', '>', $startDate)
->groupBy('date')
->orderBy('date', $order)
->lists('count', 'date');
$postsFinal = new \Illuminate\Database\Eloquent\Collection();
while ($dateCycleHolder->ne($dateCycleEnd)) {
$dateCurr = $dateCycleHolder->format('Y-m-d');
$postsFinal->put($dateCurr, $posts->get($dateCurr, 0));
$dateCycleHolder->addDay($dateInc);
}
$dateCurr = $dateCycleHolder->format('Y-m-d');
$postsFinal->put($dateCurr, $posts->get($dateCurr, 0));
$posts = $postsFinal;
它有点灵活,你可以改变这个东西的价值:
$order = 'DESC';
$endDate = Carbon::today();
$startDate = Carbon::today()->subWeek();