Laravel 查询获取还没有真实数据的日子的虚拟数据

Laravel query get dummy data for days where no real data exists yet

我的 Laravel 项目中有一个查询 return 是我数据库中两个日期之间的数据集合,然后按小时分组(但我可以将其更改为我的喜欢),我现在想 return 数据存在于数据库中之前的“日期”,作为建立我可以在我的网页上显示的日期列表的一种方式,尽管会有这几天没有数据,我的图表看起来是一致的。

举个例子:

我现在的代码如下(我用的是Carbon):

$uptimeData = UptimeChecks::where('user_id', 1)
                        ->where('monitor_id', 1)
                        ->where('checked_at', '>=', '2021-01-01 00:00:00')
                        ->where('checked_at', '<=', '2021-01-30 23:59:59')
                        ->orderBy('checked_at', 'asc')
                        ->select('event', 'checked_at')
                        ->get();

$from = Carbon::now()->subDays(60);
$period = CarbonPeriod::create($from, '2021-01-30 23:59:59');
$dates = $period->toArray();

foreach ($dates as $key => $date) {
  $dates[$key] = Carbon::parse($date)->format('Y-m-d');
}

$uptimeData = collect($uptimeData);
$uptimeData = $uptimeData->merge($dates);

$uptimeDataTimeline = $uptimeData->groupBy(function ($item, $key) {

  if (isset($item->checked_at)) {
    $date = Carbon::parse($item->checked_at);
  } else {
    $date = Carbon::parse($item);
  }

  return $date->format('Y-m-d');
});

即使没有条目显示“checked_at”列,是否可以用当天没有数据的日期进行欺骗?

更新 03/05 @20:30

我已经更新了我的描述以反映解决这个问题的最新尝试,我似乎已经构建了我需要的东西,但是,有一些问题:

  1. 我在 $dates 循环的地方有没有办法在每个项目中建立一些结构,这样我就不必对所有变量和键进行 if/else 检查?
  2. 出于某种原因,在真实数据之后添加了“假的”虚拟日期,例如:1 月 1 日、1 月 2 日、12 月 30 日...我该如何撤销?

实现此目的的一种方法是创建所需时间段的日期集合,然后将按日期分组的查询结果合并到其中。

这是一个例子:


$from = '2021-01-01';
$to = '2021-01-31';

$period = CarbonPeriod::create($from, $to);
$dates = collect($period->toArray())->mapWithKeys(function ($date) {
  return [$date->format('Y-m-d') => []];
});

// $dates = ['2021-01-01' => [], '2021-01-02' => [], ...etc]

$uptimeChecks = UptimeChecks::query()
    ->where('user_id', 1)
    ->where('monitor_id', 1)
    ->whereBetween('checked_at', [$from, $to])
    ->orderBy('checked_at', 'asc')
    ->select('event', 'checked_at')
    ->get();

$uptimeDates = $uptimeChecks->groupBy(function ($item, $key) {
  return $item->checked_at->format('Y-m-d');
});

// $uptimeDates = ['2021-01-02' => ['event1', 'event2'], ...etc]

$uptimeData = $dates->merge($uptimeDates);

// $uptimeData = ['2021-01-01' => [], '2021-01-02' => ['event1', 'event2'], ...etc]

这假设您将 checked_at 字段转换为 UptimeChecks 模型中的日期。