Files
nuhodds_fi4/app/Filament/Clusters/StaticData/Resources/StatistikoPlayers/Tables/StatistikoPlayersTable.php
T
2026-10-11 08:36:20 +02:00

113 lines
5.2 KiB
PHP

<?php
namespace App\Filament\Clusters\StaticData\Resources\StatistikoPlayers\Tables;
use App\Models\StatistikoEvent;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
class StatistikoPlayersTable
{
public static function configure(Table $table): Table
{
return $table
->searchable(false)
->columns([
TextColumn::make('match_id')
->color('info')
->icon('phosphor-copy')
->copyable()
->sortable()
->searchable(
isIndividual: true
),
TextColumn::make('ss_player_id')
->sortable()
->label('Player Id')
->color('success')
->icon('phosphor-copy')
->copyable()
->searchable(
isIndividual: true,
),
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')->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);
});
}
),
])
->emptyStateHeading('No player double in an event')
->deferFilters(false)
->recordActions([
EditAction::make()->iconButton(),
DeleteAction::make()->iconButton(),
]);
}
}