From c6bfe04b6af1c18b88cf54696ce4c189345f98f4 Mon Sep 17 00:00:00 2001 From: salam Date: Thu, 29 Oct 2026 15:39:57 +0100 Subject: [PATCH] test --- .../Pages/ListStatistikoPlayers.php | 92 ++++++++++++++++++- .../Exports/StatistikoPlayerExporter.php | 8 ++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Pages/ListStatistikoPlayers.php b/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Pages/ListStatistikoPlayers.php index 186bedab..1e3a7192 100644 --- a/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Pages/ListStatistikoPlayers.php +++ b/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Pages/ListStatistikoPlayers.php @@ -13,6 +13,7 @@ use Filament\Actions\Exports\Models\Export; use Filament\Forms\Components\Select; use Filament\Resources\Pages\ListRecords; use Illuminate\Database\Eloquent\Builder; +use Symfony\Component\HttpFoundation\StreamedResponse; class ListStatistikoPlayers extends ListRecords { @@ -21,11 +22,100 @@ class ListStatistikoPlayers extends ListRecords protected function getHeaderActions(): array { return [ + Action::make('clean_download') + ->label('Direkter Download') + ->icon('heroicon-o-arrow-down-tray') + ->action(function (): StreamedResponse { + return response()->streamDownload(function () { + // 1. Output-Stream öffnen + $output = fopen('php://output', 'w'); + + // 2. CSV-Header schreiben + fputcsv($output, ['ID', 'Nachricht', 'Level', 'Erstellt am']); + + // 3. MongoDB Cursor nutzen (Lädt immer nur 1 Dokument gleichzeitig in den RAM) + StatistikoPlayer::cursor()->each(function ($row) use ($output) { + fputcsv($output, [ + $row->match_id ?? '', + $row->ss_player_id ?? '', + $row->tm_player_id ?? '', + $row->sport_id ?? '', + $row->activeteam_id ?? '', + $row->assists ?? '', + $row->bcc ?? '', + $row->bcm ?? '', + $row->blocked_shots ?? '', + $row->card_red ?? '', + $row->card_yellow ?? '', + $row->card_yellowred ?? '', + $row->clearance_off_line ?? '', + $row->clearances ?? '', + $row->cross_done ?? '', + $row->description_event_during_the_match ?? '', + $row->dispossessed ?? '', + $row->dribbled_past ?? '', + $row->dribbles_won ?? '', + $row->errors_lead_to_a_goal ?? '', + $row->errors_lead_to_a_shot ?? '', + $row->fouls ?? '', + $row->goals ?? '', + $row->good_high_claim ?? '', + $row->hit_woodwork ?? '', + $row->ingamepenalty_missed ?? '', + $row->interceptions ?? '', + $row->key_pass ?? '', + $row->last_man_tackle ?? '', + $row->lineup ?? '', + $row->long_balls ?? '', + $row->minute_event_during_the_match ?? '', + $row->minutes_played ?? '', + $row->offsides ?? '', + $row->own_goals ?? '', + $row->pass ?? '', + $row->penalty_committed ?? '', + $row->penalty_miss ?? '', + $row->penalty_save ?? '', + $row->penalty_won ?? '', + $row->penaltyshoutout_missed ?? '', + $row->penaltyshoutout_scored ?? '', + $row->player_position ?? '', + $row->playerrating_value ?? '', + $row->playersubstitute_id ?? '', + $row->possessions_lost ?? '', + $row->punches ?? '', + $row->runs_out ?? '', + $row->saves ?? '', + $row->saves_from_in_box ?? '', + $row->shots_blocked ?? '', + $row->shots_off_target ?? '', + $row->shots_on_target ?? '', + $row->subtype_event_during_the_match ?? '', + $row->total_aerial_duels ?? '', + $row->total_cross ?? '', + $row->total_dribbles ?? '', + $row->total_duels_aerial_won ?? '', + $row->total_ground_duels ?? '', + $row->total_ground_duels_won ?? '', + $row->total_long_balls ?? '', + $row->total_pass ?? '', + $row->total_runs_out ?? '', + $row->total_tackles ?? '', + $row->touches ?? '', + $row->type_event_during_the_match ?? '', + $row->updated_at ?? '', + $row->was_fouled ?? '', + ]); + }); + + // 4. Stream schließen + fclose($output); + }, 'player-history_all_'.now()->format('Y-m-d_H-i-s').'.csv'); + }), ExportAction::make('download_players') ->label('Download') ->icon('phosphor-download') ->columnMapping(false) - ->chunkSize(1000) + ->chunkSize(250) ->exporter(StatistikoPlayerExporter::class) ->fileName(function (Export $export): string { $options = $export->getOptions(); diff --git a/app/Filament/Exports/StatistikoPlayerExporter.php b/app/Filament/Exports/StatistikoPlayerExporter.php index 6549996c..1fb35fe0 100644 --- a/app/Filament/Exports/StatistikoPlayerExporter.php +++ b/app/Filament/Exports/StatistikoPlayerExporter.php @@ -7,6 +7,7 @@ use Filament\Actions\Exports\ExportColumn; use Filament\Actions\Exports\Exporter; use Filament\Actions\Exports\Models\Export; use Filament\Forms\Components\Select; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Number; class StatistikoPlayerExporter extends Exporter @@ -115,4 +116,11 @@ class StatistikoPlayerExporter extends Exporter return $body; } + + public static function modifyQueryUsing(Builder $query): Builder + { + // Sortiert standardmäßig nach der MongoDB-internen ID vor, + // um eine konsistente Paginierung ohne chunkById-Fehler zu erzwingen + return $query->orderBy('_id', 'asc'); + } }