components([ TextInput::make('student_id') ->label('学生ID') ->numeric() ->required() ->disabled(fn (?Student $record) => filled($record)), TextInput::make('name') ->label('姓名') ->required() ->maxLength(128), TextInput::make('grade') ->label('年级') ->required() ->maxLength(32), TextInput::make('class_name') ->label('班级') ->required() ->maxLength(64), Select::make('teacher_id') ->label('指导老师') ->options(fn () => self::teacherOptions()) ->searchable() ->required() ->preload(), Textarea::make('remark') ->label('备注') ->rows(3) ->columnSpanFull(), ])->columns(2); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('student_id') ->label('学生ID') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('name') ->label('姓名') ->weight('bold') ->searchable(), Tables\Columns\TextColumn::make('grade') ->label('年级') ->sortable(), Tables\Columns\TextColumn::make('class_name') ->label('班级') ->sortable(), ]) ->filters([ Tables\Filters\SelectFilter::make('grade') ->label('年级') ->options(fn () => self::gradeOptions()), Tables\Filters\SelectFilter::make('class_name') ->label('班级') ->options(fn () => self::classOptions()), ]); } public static function getPages(): array { return [ 'index' => Pages\ListStudents::route('/'), 'create' => Pages\CreateStudent::route('/create'), 'view' => Pages\ViewStudent::route('/{record}'), 'edit' => Pages\EditStudent::route('/{record}/edit'), ]; } protected static function teacherOptions(): array { return DB::table('teachers') ->join('users', 'teachers.user_id', '=', 'users.user_id') ->where('users.role', 'teacher') ->pluck('users.full_name', 'teachers.teacher_id') ->toArray(); } protected static function gradeOptions(): array { return DB::table('students') ->distinct() ->orderBy('grade') ->pluck('grade', 'grade') ->toArray(); } protected static function classOptions(): array { return DB::table('students') ->distinct() ->orderBy('class_name') ->pluck('class_name', 'class_name') ->toArray(); } }