Pobranie zgrupowanych danych

0

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,
     }
   ]
 }
]
0

Musisz zrobic funkjce w bazie i zwyczjanie wywolywac ja w zapytaniu

SELECT user.id, get_statistics(user.id) 
FROM users

1 użytkowników online, w tym zalogowanych: 0, gości: 1