When you build a system that requires scoring or grading, you might immediately grab a custom page. But did you know that this can be made inside a table?
In this project, we make use of the Filament Resource feature:
app/Filament/Resources/Tournaments/TournamentResource.php
use App\Filament\Resources\Tournaments\Pages\CreateTournament;use App\Filament\Resources\Tournaments\Pages\EditTournament;use App\Filament\Resources\Tournaments\Pages\ListTournaments;use App\Filament\Resources\Tournaments\Pages\ManagePlayerStats;use App\Filament\Resources\Tournaments\Schemas\TournamentForm;use App\Filament\Resources\Tournaments\Tables\TournamentsTable;use App\Models\Tournament;use BackedEnum;use Filament\Resources\Resource;use Filament\Schemas\Schema;use Filament\Support\Icons\Heroicon;use Filament\Tables\Table; class TournamentResource extends Resource{ // ... public static function getRelations(): array { return [ RelationManagers\TeamsRelationManager::class, RelationManagers\MatchesRelationManager::class, ]; } // ...}
This allows us to have two relation managers inside our Tournament Resource and manage Teams/Matches:
app/Filament/Resources/Tournaments/RelationManagers/TeamsRelationManager.php
use App\Models\User;use Filament\Actions\AttachAction;use Filament\Actions\BulkActionGroup;use Filament\Actions\CreateAction;use Filament\Actions\DeleteAction;use Filament\Actions\DeleteBulkAction;use Filament\Actions\DetachAction;use Filament\Actions\DetachBulkAction;use Filament\Actions\EditAction;use Filament\Forms\Components\Select;use Filament\Forms\Components\TextInput;use Filament\Resources\RelationManagers\RelationManager;use Filament\Schemas\Schema;use Filament\Tables\Columns\TextColumn;use Filament\Tables\Table; class TeamsRelationManager extends RelationManager{ protected static string $relationship = 'teams'; public function form(Schema $schema): Schema { return $schema ->components([ TextInput::make('name') ->required() ->maxLength(255), // ...
Next, in this example, we will: