从用户表中获取折线图的数据(chart.js)

r1zk6ea1  于 2023-08-05  发布在  Chart.js
关注(0)|答案(3)|浏览(151)

下面是我正在努力实现的图像:-
x1c 0d1x的数据
我在Laravel上,我想根据有多少新用户进入网站以及有多少用户从网站删除帐户,从用户表中获取当前日期数据的过去30天。我已使用软删除管理已删除的用户。我必须在chat.js中显示这些数据。我已经做了下面的代码,但没有为我的chat.js获得正确的数据

$startDate = now()->subDays(30)->startOfDay();
        $endDate = now()->endOfDay();

        $days = [];
        $currentDate = clone $startDate;

        $allUsers = User::count();
        while ($currentDate->lte($endDate)) {
            $days[$currentDate->format('M d')] = $allUsers;
            $currentDate->addDay();
        }

        $records = User::withTrashed()
            ->whereBetween('created_at', [$startDate, $endDate])
            ->select('created_at', 'deleted_at')
            ->get();

        foreach ($records as $record) {
            $date = Carbon::parse($record->created_at)->format('M d');

            if($allUsers != 0){
                $days[$date] += $record->deleted_at ? -1 : 1;
            }
        }
        
        $labels = array_keys($days);
        $data = array_values($days);

        return [
            'datasets' => [
                [
                    'label' => 'New user',
                    'data' => $data,
                ],
            ],
            'labels' => $labels,
        ];

字符串
我已经设法获取数据,但生成的数据不正确。我想在chat.js中显示过去30天的数据。例如,如果今天是2019年7月14日,我想获取2019年6月14日到2019年7月14日之间的数据。并且如果在23年6月14日之前,在用户表中有5个活动用户,并且在最近30天之间有一些新用户进入,则计数必须从6开始。
这是在我的用户表screenshort
这是输出output screenshot

ubof19bj

ubof19bj1#

我建议创建一个表或视图来计算一天结束时的用户数量。这样,您就不必在每次加载图表时都运行相同的查询和计算。
1.创建一个命令php artisan make:command GenerateUserCounts,该命令应该为$date的输入生成用户计数,默认情况下为today()
1.计划命令在一天结束前运行

$schedule->command('users:log-count')->dailyAt('00:00');

字符串
1.手动运行前几天的命令

cl25kdpy

cl25kdpy2#

foreach ($records as $record) {
  $date = Carbon::parse($record->created_at)->format('M d');
  $prevDate = Carbon::parse($record->created_at)->subDay()->format('M d');
  $days[$date] = $days[$date] + ($days[$prevDate] ?? 0);

  if($allUsers != 0){
    $days[$date] += $record->deleted_at ? -1 : 1;
  }
}

字符串

g6ll5ycj

g6ll5ycj3#

从你的代码中,似乎你试图在下面的行中实现一些东西:
1.预先填充一个天数数组,其中包含周期开始时的用户计数(这里有一个bug);
1.循环访问天数,添加已创建用户的计数并删除已删除用户的计数。
我看到的错误是你在期末而不是期初开始计数。您不应该使用$allUsers预填充所有日期,而应该仅使用$usersAtBeginning = User::where('created_at', '<' $startDate)预填充开始的用户。
尽管如此,正如我所提到的,通过更好地利用Laravel特性,您的代码可以更直接(更快)。在本例中,是Collection的方法。你的函数可能看起来像这样:

$startDate = now()->subDays(30)->startOfDay();
$endDate = now()->endOfDay();

/** @var Collection<int, User> */
$users = User::query()
    ->withTrashed()
    ->whereBetween('created_at', [$startDate, $endDate])
    ->get(['created_at', 'deleted_at']);

$totalAtTime = User::query()
    ->where('created_at', '<', $startDate)
    ->whereNull('deleted_at')
    ->count();

$current = $startDate;
while ($current <= $endDate) {
    $next = (clone $current)->endOfDay();

    $created = $users->whereBetween('created_at', [
        $current,
         $next,
    ])
        ->count();

    $deleted = $users->whereBetween('deleted_at', [
        $current,
        $next,
    ])
        ->count();

    $totalAtTime += $created - $deleted;

    $data[$current->format('M d')] = $totalAtTime;
    $current->addDay();
}

字符串

相关问题