113 lines
5.2 KiB
PHP
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(),
|
|
]);
|
|
}
|
|
}
|