Chcę wyświetlić historię z 7 dni wstecz z levelem jaki dany user osiągnął w danym dniu.
Mam tabelę users
, która jest połączona relacyjnie z tabelą user_statistics
.
W tabeli user_statistics
jest kolumna level
. Trzeba z danego dnia wyciągnąć minimalną i maksymalną wartość i obliczyć różnicę leveli (da się to zrobić bezpośrednio w zapytaniu? Do tej pory wyciągałem to i to i obliczałem w PHP)
Do tej pory zrobiłem coś takiego, ale czy można to zrobić inaczej/lepiej?
$days = collect();
foreach (range(1, 7) as $dayNumber) {
$data = $users()
->withMin(
['statistics' => fn ($query) => $query->whereDate('created_at', '=', now()->subDays($dayNumber))],
'level'
)
->withMax(
['statistics' => fn ($query) => $query->whereDate('created_at', '=', now()->subDays($dayNumber))],
'level'
)
->get();
$new = $data->map(function ($item) {
$item->levelDifference = $item->statistics_max_level - $item->statistics_min_level;
return $item;
});
$sorted = $new->sortByDesc('levelDifference')->take(50);
$days->put(
$dayNumber,
$sorted->values()->all(),
);
}
return $days;
Teraz otrzymuje wyniki w takiej formie:
{
1: [
{user1 + levelDifference},
{user1 + levelDifference},
],
2: [
{user2 + levelDifference},
{user2 + levelDifference},
]
}
A chciałbym:
[
{
...user,
statistics: [
1: {
"minLevel": 5,
"maxLevel": 10
"levelDifference": 5,
},
2: {
"minLevel": 10,
"maxLevel": 20
"levelDifference": 10,
}
]
}
]