【问题标题】:How to get last 7 days records with 0 counts如何获得 0 计数的最近 7 天记录
【发布时间】:2020-04-20 21:33:24
【问题描述】:

我有一个雄辩的查询,可以获取过去 7 天的总计数记录 (created_at)。但问题是,如果其中一天有 0 条记录,这不会出现在最终数据中。

我的查询:

$data = Data::whereBetween('created_at', [Carbon::now()->subDays(6)->format('Y-m-d')." 00:00:00", Carbon::now()->format('Y-m-d')." 23:59:59"])
             ->groupBy('date')
             ->orderBy('date')
             ->get([
                 DB::raw('DATE(created_at) as date'),
                 DB::raw('count(*) as total')
             ])
             ->pluck('total', 'date')->toArray();

我得到了什么:

[    
    "2020-04-14" => 1
    "2020-04-16" => 1
    "2020-04-18" => 1
    "2020-04-19" => 1
]

我的预期:

[    
    "2020-04-14" => 1    
    "2020-04-15" => 0
    "2020-04-16" => 1    
    "2020-04-17" => 0
    "2020-04-18" => 1
    "2020-04-19" => 1    
    "2020-04-20" => 0
]

有什么建议吗?

解决方案:

-基于 Gary Houbre 的提议:

$results = Data::whereBetween('created_at', [Carbon::now()->subDays(6)->format('Y-m-d')." 00:00:00", Carbon::now()->format('Y-m-d')." 23:59:59"])
    ->groupBy('date')
    ->orderBy('date')
    ->get([
        DB::raw('DATE_FORMAT(created_at, "%Y-%m-%d") as date'),
        DB::raw('count(*) as total')
    ])
    ->keyBy('date')
    ->map(function ($item) {
        $item->date = Carbon::parse($item->date);
        return $item;
    });

$period = new DatePeriod(Carbon::now()->subDays(6), CarbonInterval::day(), Carbon::now()->addDay());

$graph = array_map(function ($datePeriod) use ($results) {
    $date = $datePeriod->format('Y-m-d');
    return $results->has($date) ? $results->get($date)->total : 0;

}, iterator_to_array($period));

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    直接看Sql:How to include "zero" / "0" results in COUNT aggregate?

    进入同一张表:How to get the record if Count is zero in Laravel

    您需要使用 Eloquent 在请求中添加外部联接。

    【讨论】:

    • 我没有加入两张桌子,我正在处理同一张桌子。我不确定这是否可行。无论如何,谢谢,我会试试的!
    【解决方案2】:

    我的想法是创建一个for 循环来检查日期。

    如果某个日期没有记录,则打印0

    循环迭代:

    • 赶上第一天(假设 14)
    • 赶上最后一天
    • 然后在每次迭代中检查它是否大于一个或多个

    因此,我希望你能正常。

    【讨论】:

    • 谢谢!但这是我的最后一个选择,我正在尝试找到一个自动选项。不过感谢您的帮助!
    【解决方案3】:

    我们在尝试将后端数据放入图表时遇到了类似的问题。由于有些日子不见了,所以看起来不太好。我们的解决方案是;

    创建一个这样的函数;

    public function generateDates(Date $startDate, Date $endDate, $format = 'Y/m/d'): Collection
    {
        $dates = collect();
        $startDate = $startDate->copy();
    
        for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
            $dates->put($date->format($format), 0);
        }
    
        return $dates;
    }
    

    在您的情况下,它将是(今天和今天 - 六天),您将 union 与您的查询集合一起返回集合。它的作用是;它从键创建一个日期范围并用零填充它们。当您的查询集合具有非零值时 - 它会覆盖它。

    【讨论】:

    • 是的,我有类似的东西可以收集从今天起前 6 天的日期。后来,用于@Mr.提出的解决方案。完美主义者。如果对您有帮助,我已将解决方案添加到帖子中。
    猜你喜欢
    • 2020-06-06
    • 2015-03-27
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多