join('cities', 'cities.country_id', '=', 'countries.id') ->join('meetups', 'meetups.city_id', '=', 'cities.id') ->join('meetup_user', 'meetup_user.meetup_id', '=', 'meetups.id') ->groupBy('countries.id') ->selectRaw('COUNT(DISTINCT meetup_user.user_id) as user_count') ->orderBy('user_count', 'desc') ->limit(10) ->get() ->map(function ($country) { // Optimierte Query: Hole alle User-Erstellungsdaten für dieses Land auf einmal $userCreationDates = \DB::table('users') ->join('meetup_user', 'users.id', '=', 'meetup_user.user_id') ->join('meetups', 'meetup_user.meetup_id', '=', 'meetups.id') ->join('cities', 'meetups.city_id', '=', 'cities.id') ->where('cities.country_id', $country->id) ->whereNotNull('users.created_at') ->orderBy('users.created_at') ->pluck('users.created_at') ->unique() ->values(); if ($userCreationDates->isEmpty()) { $country->sparkline = [0]; return $country; } // 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); } $country->sparkline = $sparklineData; return $country; }); return [ 'topCountries' => $topCountries, ]; } public function placeholder(): string { return <<<'HTML'
{{ __('Top Länder') }} {{ __('Länder mit den meisten Usern') }}
HTML; } }; ?>
{{ __('Top Länder') }} {{ __('Länder mit den meisten Usern') }} @if($topCountries->count() > 0)
@foreach($topCountries as $country) @endforeach
@else
{{ __('Keine Daten verfügbar') }}
@endif