with(['city.country']) ->orderBy('users_count', 'desc') ->limit(10) ->get() ->map(function ($meetup) { // Optimierte Query: Hole alle User-Erstellungsdaten für dieses Meetup auf einmal $userCreationDates = \DB::table('users') ->join('meetup_user', 'users.id', '=', 'meetup_user.user_id') ->where('meetup_user.meetup_id', $meetup->id) ->whereNotNull('users.created_at') ->orderBy('users.created_at') ->pluck('users.created_at') ->unique() ->values(); if ($userCreationDates->isEmpty()) { $meetup->sparkline = [0]; return $meetup; } // Berechne monatliche Buckets für kumulative Zählung $startDate = \Carbon\Carbon::parse($userCreationDates->first())->startOfMonth(); $endDate = now()->endOfMonth(); $monthsDiff = max(1, $startDate->diffInMonths($endDate)); $interval = max(1, ceil($monthsDiff / 12)); // Generiere 12 Zeitpunkte $sparklineData = []; $currentDate = $startDate->copy(); for ($i = 0; $i < 12 && $currentDate <= $endDate; $i++) { // Zähle kumulative User bis zu diesem Zeitpunkt $count = $userCreationDates->filter(function ($date) use ($currentDate) { return \Carbon\Carbon::parse($date) <= $currentDate; })->count(); $sparklineData[] = $count; $currentDate->addMonths($interval); } $meetup->sparkline = $sparklineData; return $meetup; }); return [ 'topMeetups' => $topMeetups, ]; } public function placeholder(): string { return <<<'HTML'