【问题标题】:Count from each distinct date, fill in missing dates with zero从每个不同的日期开始计数,用零填充缺失的日期
【发布时间】:2015-10-09 00:43:08
【问题描述】:

我正在尝试创建一个 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');

谢谢!

【问题讨论】:

  • 可以对日期范围有任何假设吗?例如,您事先知道日期将在 2015-01-01 到 2015-01-31 之间?
  • @CrackingTheCode 日期始终是从 7 天前到今天的所有内容。

标签: laravel laravel-4 eloquent laravel-5


【解决方案1】:

在你的 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();

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 2018-02-12
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多