Получите сегодня пользователей, зарегистрированных в час - PullRequest
0 голосов
/ 03 июня 2018
public static function todayUsersPerHour() {
    $today = Carbon::today();
    $users = array();
    $hours = array();

        $a = 1;
    for($h = 0; $h < 24; $h++){
        $today->addHour($a);
        $sub = $today;
        array_push($hours, $today.' - '.$sub->subHour());
        $user = User::where([
            ['created_at', '<=', $today],
            ['created_at','>',$sub]
        ])->count();
        array_push($users, $user);
    }
    return $hours;
}

У меня есть этот статический метод, который не работает так, как я хотел.

Когда я запускаю его в трейлере laravel, я получаю:

[
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
   ]

Когда я добавляю $a++ в цикл я получаю:

[
     "2018-06-02 01:00:00 - 2018-06-02 00:00:00",
     "2018-06-02 02:00:00 - 2018-06-02 01:00:00",
     "2018-06-02 04:00:00 - 2018-06-02 03:00:00",
     "2018-06-02 07:00:00 - 2018-06-02 06:00:00",
     "2018-06-02 11:00:00 - 2018-06-02 10:00:00",
     "2018-06-02 16:00:00 - 2018-06-02 15:00:00",
     "2018-06-02 22:00:00 - 2018-06-02 21:00:00",
     "2018-06-03 05:00:00 - 2018-06-03 04:00:00",
     "2018-06-03 13:00:00 - 2018-06-03 12:00:00",
     "2018-06-03 22:00:00 - 2018-06-03 21:00:00",
     "2018-06-04 08:00:00 - 2018-06-04 07:00:00",
     "2018-06-04 19:00:00 - 2018-06-04 18:00:00",
     "2018-06-05 07:00:00 - 2018-06-05 06:00:00",
     "2018-06-05 20:00:00 - 2018-06-05 19:00:00",
     "2018-06-06 10:00:00 - 2018-06-06 09:00:00",
     "2018-06-07 01:00:00 - 2018-06-07 00:00:00",
     "2018-06-07 17:00:00 - 2018-06-07 16:00:00",
     "2018-06-08 10:00:00 - 2018-06-08 09:00:00",
     "2018-06-09 04:00:00 - 2018-06-09 03:00:00",
     "2018-06-09 23:00:00 - 2018-06-09 22:00:00",
     "2018-06-10 19:00:00 - 2018-06-10 18:00:00",
     "2018-06-11 16:00:00 - 2018-06-11 15:00:00",
     "2018-06-12 14:00:00 - 2018-06-12 13:00:00",
     "2018-06-13 13:00:00 - 2018-06-13 12:00:00",
   ]

Это добавление к последнему $today значению нового $a значения, но когда $a значение всегда равно 1, это как если бы оно никогда не продолжалось последним $todayценность, но в первую очередь.

Что я здесь не так делаю?Спасибо

1 Ответ

0 голосов
/ 03 июня 2018

Это должно дать вам результаты - с использованием только SQL:

// Only select users with `created_at` greater than today - start of the day
User::where('created_at', '>', now()->startOfDay())
    // Select created_at hour and count for that hour
    ->selectRaw('date_format(created_at, \'%Y-%m-%d %H:00:00\') as hour, count(users.id) as count')
    // Group by created_at hour
    ->groupBy(\DB::raw('date_format(created_at, \'%Y-%m-%d %H:00:00\')'))
    ->get()

Будет возвращать что-то вроде этого:

[{hour: '2018-06-02 20:00:00', count: 5}, {hour: '2018-06-02 21:00:00', count: 3}, ...]

Редактировать

Чтобы получить все 24 часа, я бы сделал это:

// Fetch needed users with 1 query
$users = User::where('created_at', '>', now()->startOfDay())->get();

$result = [];
for ($hour = 0; $hour < 24; $hour++) {
    $result[] = [
        'hour' => $hour,
        'count' => $users->filter(function ($user) use ($hour) {
            // Find users where hour equals to current iteration
            return $user->created_at->hour == $hour;
        })->count(),
    ];
}

return $result;
...