Получить данные по количеству и дате, используя Laravel - PullRequest
0 голосов
/ 06 апреля 2020

В моей базе данных mysql есть таблица пользователей, в которой я храню дату создания пользователя. Я хотел бы получить количество зарегистрированных пользователей за последние 7 дней. Пример:

[6,4,8,6,5,6,7]

Где каждое число представляет количество зарегистрированных пользователей на каждую дату в течение 7-дневного периода. Как я могу сделать это, используя Laravel?

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Вы можете использовать следующее решение, где вы можете получить обычный массив, а также другой массив, ключом которого является дата, а значением - количество пользователей, зарегистрированных в этот день.

$usersPerDay = User::select(DB::raw('count(id) as `number_of_users`'),DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d') new_date"))
                    ->whereRaw('DATE(created_at) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)')
                    ->groupBy('new_date')->orderBy('new_date')->get();

print_r($usersPerDay->pluck('number_of_users')->toArray());

print_r($usersPerDay->pluck('number_of_users', 'new_date'));

Как ваш Требуется создать дни из диапазона дат ( ссылка ), вам необходимо сделать следующее. сначала обновите строгое значение в config / database. php file

'mysql' => [
    ...
    'strict' => false,
    ...
]

, а затем выполните следующий запрос, чтобы получить желаемый результат

$query = "select 
            t1.new_date,
            coalesce(SUM(t1.number_of_users+t2.number_of_users), 0) AS number_of_users
            from
            (
              select DATE_FORMAT(a.Date,'%Y-%m-%d') as new_date,
              '0' as  number_of_users
              from (
                select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
                from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
                cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
                cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
              ) a
              where a.Date BETWEEN NOW() - INTERVAL 7 DAY AND NOW()
            )t1
            left join
            (
              SELECT DATE_FORMAT(created_at,'%Y-%m-%d') AS created_at, 
              COUNT(*) AS number_of_users
              FROM users
              WHERE DATE_SUB(created_at, INTERVAL 1 DAY) > DATE_SUB(DATE(NOW()), INTERVAL 1 WEEK) 
              GROUP BY DAY(created_at) DESC
            )t2
            on t2.created_at = t1.new_date
            group by DAY(t1.new_date)
            order by t1.new_date asc";
        $users = DB::select($query);
        $usersPerDay = collect($users)->pluck('number_of_users')->toArray();
        print_r($usersPerDay);
        die;
0 голосов
/ 06 апреля 2020

Использование Laravel Коллекция groupBy() функция.

$users = Users::whereBetween(now(), now()->subWeek())
             ->groupBy(function ($user) {
                 return $user->created_at->toDateString();
             })
             ->map(function ($group) {
                 return $group->count();
             })
             ->values()
             ->toArray();
0 голосов
/ 06 апреля 2020

со следующим кодом вы получите массив с именем и созданным в нем, а затем выполните подсчет, чтобы получить количество пользователей:

$previous_week = strtotime("-1 week +1 day");
$start_week = strtotime("last sunday midnight",$previous_week);
$end_week = strtotime("next saturday",$start_week);
$start_week = date("Y-m-d",$start_week);
$end_week = date("Y-m-d",$end_week);

$users = User::whereBetween('created_at', [$start_week, $end_week])->get(['name','created_at']);

echo count($users);

Вместо эха сделайте все, что вы захотите. надеюсь, что это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...