diff --git a/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Tables/StatistikoPlayersTable.php b/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Tables/StatistikoPlayersTable.php index 0e070d27..8cdd88a1 100644 --- a/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Tables/StatistikoPlayersTable.php +++ b/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Tables/StatistikoPlayersTable.php @@ -2,13 +2,10 @@ namespace App\Filament\Clusters\StaticData\Resources\StatistikoPlayers\Tables; -use Filament\Actions\BulkActionGroup; +use App\Models\StatistikoEvent; use Filament\Actions\DeleteAction; -use Filament\Actions\DeleteBulkAction; use Filament\Actions\EditAction; use Filament\Tables\Columns\TextColumn; -use Filament\Tables\Enums\FiltersLayout; -use Filament\Tables\Filters\Filter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; @@ -17,73 +14,99 @@ class StatistikoPlayersTable public static function configure(Table $table): Table { return $table + ->searchable(false) ->columns([ - TextColumn::make('match_id')->color('info')->icon('phosphor-copy')->copyable() + TextColumn::make('match_id') + ->color('info') + ->icon('phosphor-copy') + ->copyable() ->sortable() ->searchable( - query: fn ($query, $search) => $query->orWhere('match_id', (int) $search) + isIndividual: true ), TextColumn::make('ss_player_id') ->sortable() ->label('Player Id') - ->color('success')->icon('phosphor-copy')->copyable() + ->color('success') + ->icon('phosphor-copy') + ->copyable() ->searchable( - query: fn ($query, $search) => $query->orWhere('ss_player_id', (int) $search) + isIndividual: true, ), - TextColumn::make('details.player_name')->label('Player') - ->searchable(query: function (Builder $query, string $search): Builder { - return $query->where(function (Builder $subQuery) use ($search) { - $subQuery->where('details.player_name', 'regexp', '/'.$search.'/i') - ->orWhere('details.player_name', 'regexp', '/'.$search.'/i'); - }); - }), - TextColumn::make('event.home.ss_team_name')->color('primary')->searchable() + TextColumn::make('details.player_name') + ->label('Player') + ->searchable( + isIndividual: true, + isGlobal: false, + query: function (Builder $query, string $search): Builder { + // Wir springen in die verknüpfte MongoDB-Collection ab + return $query->whereHas('details', function (Builder $subQuery) use ($search) { + // Wichtig: Hier das Feld der FREMD-Collection durchsuchen (z.B. 'name') + $subQuery->where('player_name', 'regexp', '/'.$search.'/i'); + }); + } + ), + TextColumn::make('event.home.ss_team_name') + ->color('primary') ->sortable( query: fn (Builder $query) => $query->orderBy('event.home.ss_team_name') + )->searchable( + isIndividual: true, + isGlobal: false, + query: function (Builder $query, string $search): Builder { + + // 1. SCHRITT: In MariaDB nach passenden User-IDs suchen + // Wir nutzen die normalen SQL-Features von MariaDB (LIKE) + $matchingTeamIds = StatistikoEvent::whereHas('home', function ($teamQuery) use ($search) { + $teamQuery->where('ss_team_name', 'LIKE', "%{$search}%"); + }) + ->pluck('home_id') // Holt alle IDs der passenden User als flaches Array + ->toArray(); + + // 2. SCHRITT: MongoDB filtern + // Wenn MariaDB keine Treffer hatte, erzwingen wir eine leere Tabelle + if (empty($matchingTeamIds)) { + return $query->where('_id', '=', null); + } + + return $query->whereHas('event', function (Builder $subQuery) use ($matchingTeamIds) { + $subQuery->whereIn('home_id', $matchingTeamIds); + }); + } ), - TextColumn::make('event.away.ss_team_name')->searchable()->color('success') + TextColumn::make('event.away.ss_team_name')->color('success') ->sortable( query: fn (Builder $query) => $query->orderBy('ss_team_name') + )->searchable( + isIndividual: true, // Einzelnes Suchfeld für diese Spalte + isGlobal: false, // Globales Suchfeld deaktiviert lassen + query: function (Builder $query, string $search): Builder { + + // 1. SCHRITT: In MariaDB nach passenden User-IDs suchen + // Wir nutzen die normalen SQL-Features von MariaDB (LIKE) + $matchingTeamIds = StatistikoEvent::whereHas('away', function ($teamQuery) use ($search) { + $teamQuery->where('ss_team_name', 'LIKE', "%{$search}%"); + }) + ->pluck('away_id') // Holt alle IDs der passenden User als flaches Array + ->toArray(); + + // 2. SCHRITT: MongoDB filtern + // Wenn MariaDB keine Treffer hatte, erzwingen wir eine leere Tabelle + if (empty($matchingTeamIds)) { + return $query->where('_id', '=', null); + } + + return $query->whereHas('event', function (Builder $subQuery) use ($matchingTeamIds) { + $subQuery->whereIn('away_id', $matchingTeamIds); + }); + } ), ]) - // ->filters([ - // Filter::make('player_filters') - // ->schema([ - // Checkbox::make('find_double'), - // ])->query(function (Builder $query, array $data): Builder { - // return $query->when( - // $data['find_double'], - // function (Builder $query) { - // $arr = []; - // $events = StatistikoPlayer::query()->select('match_id', 'ss_player_id')->get()->toArray(); - // foreach ($events as $value) { - // $match_id = $value['match_id']; - // $player_id = $value['ss_player_id']; - // if (isset($arr[$match_id]) && in_array($player_id, $arr[$match_id])) { - // return $query->where('match_id', $match_id)->where('ss_player_id', $player_id); - // } - // $arr[$match_id][] = $player_id; - // } - // return $query->where('match_id', 0); - // } - // ); - // })->indicateUsing(function (array $data): ?string { - // if (! $data['find_double']) { - // return null; - // } - // return 'Find Double'; - // }), - // ], layout: FiltersLayout::AboveContent) ->emptyStateHeading('No player double in an event') ->deferFilters(false) ->recordActions([ EditAction::make()->iconButton(), DeleteAction::make()->iconButton(), - ]) - ->toolbarActions([ - BulkActionGroup::make([ - DeleteBulkAction::make(), - ]), ]); } }