schema([ // 学生ID字段在创建时隐藏,编辑时显示但禁用 TextInput::make('student_id') ->label('学生ID') ->disabled() ->hidden(fn (?Student $record) => blank($record)) ->formatStateUsing(fn (?Student $record): string => $record?->student_id ?? ''), TextInput::make('name') ->label('姓名') ->required() ->maxLength(128) ->placeholder('请输入学生姓名'), TextInput::make('grade') ->label('年级') ->required() ->maxLength(32) ->placeholder('例如:高一、高二等'), TextInput::make('class_name') ->label('班级') ->helperText('选填项,如不确定可留空') ->maxLength(64) ->placeholder('例如:1班、2班等'), Select::make('teacher_id') ->label('指导老师') ->options(fn () => self::teacherOptions()) ->searchable() ->required() ->preload() ->placeholder('请选择指导老师'), Textarea::make('remark') ->label('备注') ->rows(3) ->placeholder('请输入备注信息(可选)') ->columnSpanFull(), ])->columns(2); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('student_id') ->label('学生ID') ->badge() ->color('primary') ->copyable() ->copyMessage('学生ID已复制') ->copyMessageDuration(1500) ->sortable() ->searchable(), Tables\Columns\TextColumn::make('name') ->label('姓名') ->weight('bold') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('grade') ->label('年级') ->badge() ->color('success') ->sortable(), Tables\Columns\TextColumn::make('class_name') ->label('班级') ->placeholder('未分配') ->sortable() ->formatStateUsing(fn ($state) => $state ?: '未分配'), Tables\Columns\TextColumn::make('teacher.user.full_name') ->label('指导老师') ->default('未分配') ->sortable() ->searchable(), ]) ->filters([ Tables\Filters\SelectFilter::make('grade') ->label('年级') ->options(fn () => self::gradeOptions()) ->placeholder('全部年级'), Tables\Filters\SelectFilter::make('class_name') ->label('班级') ->options(fn () => self::classOptions()) ->placeholder('全部班级'), Tables\Filters\SelectFilter::make('teacher_id') ->label('指导老师') ->options(fn () => self::teacherOptions()) ->placeholder('全部老师'), ]) ->actions([]) ->bulkActions([]) ->emptyStateHeading('暂无学生记录') ->emptyStateDescription('开始创建你的第一个学生吧') ->emptyStateActions([]); } 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 { // 使用缓存优化性能,缓存1小时 return cache()->remember('teacher_options', 3600, function () { return Teacher::with(['user' => function ($query) { $query->select('user_id', 'full_name', 'role'); }]) ->whereHas('user', function ($query) { $query->where('role', 'teacher'); }) ->select('teacher_id', 'user_id', 'name') ->get() ->map(function ($teacher) { return [ 'id' => $teacher->teacher_id, 'name' => $teacher->user->full_name ?? $teacher->name ]; }) ->pluck('name', 'id') ->toArray(); }); } protected static function gradeOptions(): array { // 使用缓存优化性能,缓存30分钟 return cache()->remember('grade_options', 1800, function () { return Student::query() ->select('grade') ->distinct() ->whereNotNull('grade') ->orderBy('grade') ->pluck('grade', 'grade') ->toArray(); }); } protected static function classOptions(): array { // 使用缓存优化性能,缓存30分钟 return Cache::remember('class_options', 1800, function () { return Student::query() ->select('class_name') ->whereNotNull('class_name') ->where('class_name', '!=', '') ->distinct() ->orderBy('class_name') ->pluck('class_name', 'class_name') ->toArray(); }); } /** * 清除相关缓存 */ public static function clearCaches(): void { Cache::forget('teacher_options'); Cache::forget('grade_options'); Cache::forget('class_options'); } }