This commit is contained in:
salam committed 2026-10-11 08:36:20 +02:00
1 parent ed9e1db12e
commit e3e74f7d91
1 file changed
+73 -50
@@ -2,13 +2,10 @@
namespace App\Filament\Clusters\StaticData\Resources\StatistikoPlayers\Tables; namespace App\Filament\Clusters\StaticData\Resources\StatistikoPlayers\Tables;
use Filament\Actions\BulkActionGroup; use App\Models\StatistikoEvent;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
@@ -17,73 +14,99 @@ class StatistikoPlayersTable
public static function configure(Table $table): Table public static function configure(Table $table): Table
{ {
return $table return $table
->searchable(false)
->columns([ ->columns([
TextColumn::make('match_id')->color('info')->icon('phosphor-copy')->copyable() TextColumn::make('match_id')
->color('info')
->icon('phosphor-copy')
->copyable()
->sortable() ->sortable()
->searchable( ->searchable(
query: fn ($query, $search) => $query->orWhere('match_id', (int) $search) isIndividual: true
), ),
TextColumn::make('ss_player_id') TextColumn::make('ss_player_id')
->sortable() ->sortable()
->label('Player Id') ->label('Player Id')
->color('success')->icon('phosphor-copy')->copyable() ->color('success')
->icon('phosphor-copy')
->copyable()
->searchable( ->searchable(
query: fn ($query, $search) => $query->orWhere('ss_player_id', (int) $search) isIndividual: true,
), ),
TextColumn::make('details.player_name')->label('Player') TextColumn::make('details.player_name')
->searchable(query: function (Builder $query, string $search): Builder { ->label('Player')
return $query->where(function (Builder $subQuery) use ($search) { ->searchable(
$subQuery->where('details.player_name', 'regexp', '/'.$search.'/i') isIndividual: true,
->orWhere('details.player_name', 'regexp', '/'.$search.'/i'); isGlobal: false,
}); query: function (Builder $query, string $search): Builder {
}), // Wir springen in die verknüpfte MongoDB-Collection ab
TextColumn::make('event.home.ss_team_name')->color('primary')->searchable() 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( ->sortable(
query: fn (Builder $query) => $query->orderBy('event.home.ss_team_name') 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( ->sortable(
query: fn (Builder $query) => $query->orderBy('ss_team_name') 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') ->emptyStateHeading('No player double in an event')
->deferFilters(false) ->deferFilters(false)
->recordActions([ ->recordActions([
EditAction::make()->iconButton(), EditAction::make()->iconButton(),
DeleteAction::make()->iconButton(), DeleteAction::make()->iconButton(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]); ]);
} }
} }