wip
This commit is contained in:
1 parent
ed9e1db12e
commit
e3e74f7d91
1 file changed
+73
-50
+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(),
|
|
||||||
]),
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user