Laravel 查询获取还没有真实数据的日子的虚拟数据
Laravel query get dummy data for days where no real data exists yet
我的 Laravel 项目中有一个查询 return 是我数据库中两个日期之间的数据集合,然后按小时分组(但我可以将其更改为我的喜欢),我现在想 return 数据存在于数据库中之前的“日期”,作为建立我可以在我的网页上显示的日期列表的一种方式,尽管会有这几天没有数据,我的图表看起来是一致的。
举个例子:
- 我想看过去30天的数据作为历史记录,但是前20天还没有数据,我还需要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
我已经更新了我的描述以反映解决这个问题的最新尝试,我似乎已经构建了我需要的东西,但是,有一些问题:
- 我在
$dates
循环的地方有没有办法在每个项目中建立一些结构,这样我就不必对所有变量和键进行 if/else
检查?
- 出于某种原因,在真实数据之后添加了“假的”虚拟日期,例如: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
模型中的日期。
我的 Laravel 项目中有一个查询 return 是我数据库中两个日期之间的数据集合,然后按小时分组(但我可以将其更改为我的喜欢),我现在想 return 数据存在于数据库中之前的“日期”,作为建立我可以在我的网页上显示的日期列表的一种方式,尽管会有这几天没有数据,我的图表看起来是一致的。
举个例子:
- 我想看过去30天的数据作为历史记录,但是前20天还没有数据,我还需要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
我已经更新了我的描述以反映解决这个问题的最新尝试,我似乎已经构建了我需要的东西,但是,有一些问题:
- 我在
$dates
循环的地方有没有办法在每个项目中建立一些结构,这样我就不必对所有变量和键进行if/else
检查? - 出于某种原因,在真实数据之后添加了“假的”虚拟日期,例如: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
模型中的日期。