Laravel Filament资源详情页实现Shopify式订阅历史表格展示
在Laravel Filament订阅详情页添加订阅历史表格(仿Shopify样式)
方案一:使用关联管理器(Relation Manager)(推荐,适合关联模型场景)
如果你的订阅历史是Subscription模型的关联数据(一个订阅对应多条历史记录),用Filament的Relation Manager是最便捷的方式:
- 确认模型关联
在Subscription模型中定义与订阅历史模型的关联:
// app/Models/Subscription.php public function subscriptionHistories() { return $this->hasMany(SubscriptionHistory::class); }
- 生成关联管理器
执行Artisan命令生成对应的Relation Manager文件:
php artisan make:filament-relation-manager SubscriptionResource subscriptionHistories
- 配置表格样式与字段
打开生成的SubscriptionHistoriesRelationManager.php文件,按照Shopify风格配置表格列、徽章、筛选器:
// app/Filament/Resources/SubscriptionResource/RelationManagers/SubscriptionHistoriesRelationManager.php use Filament\Tables; use Filament\Tables\Table; use Filament\Resources\RelationManagers\RelationManager; class SubscriptionHistoriesRelationManager extends RelationManager { protected static string $relationship = 'subscriptionHistories'; public function table(Table $table): Table { return $table ->recordTitleAttribute('event') ->columns([ Tables\Columns\TextColumn::make('created_at') ->label('时间') ->dateTime('Y-m-d H:i:s') ->sortable(), Tables\Columns\TextColumn::make('event') ->label('事件类型') ->badge() ->color(fn(string $state): string => match($state) { 'activated' => 'success', 'cancelled' => 'danger', 'renewed' => 'warning', default => 'gray', }), Tables\Columns\TextColumn::make('details') ->label('详情') ->limit(50), // 根据需求添加更多列 ]) ->filters([ Tables\Filters\SelectFilter::make('event') ->options([ 'activated' => '已激活', 'cancelled' => '已取消', 'renewed' => '已续费', ]), ]) ->defaultSort('created_at', 'desc'); } }
- 注册关联管理器
在SubscriptionResource的getRelations()方法中注册管理器,详情页会自动生成标签页展示历史表格:
// app/Filament/Resources/SubscriptionResource.php public static function getRelations(): array { return [ RelationManagers\SubscriptionHistoriesRelationManager::class, ]; }
方案二:直接嵌入详情页(适合非关联或自定义布局场景)
如果需要把表格直接嵌入详情页区块,而非标签页,可在详情页的Infolist中直接添加Table组件:
// app/Filament/Resources/SubscriptionResource.php use Filament\Infolists\Components\Section; use Filament\Tables; use Filament\Tables\Table; public static function infolist(Infolist $infolist): Infolist { return $infolist ->schema([ // 保留原有订阅详情字段 Section::make('订阅基本信息') ->schema([ // ... 现有字段配置 ]), // 添加订阅历史表格区块 Section::make('订阅历史') ->schema([ Tables\Components\Table::make() ->query(fn(\App\Models\Subscription $record) => \App\Models\SubscriptionHistory::where('subscription_id', $record->id)) ->columns([ Tables\Columns\TextColumn::make('created_at') ->label('时间') ->dateTime() ->sortable(), Tables\Columns\TextColumn::make('event') ->label('事件类型') ->badge(), Tables\Columns\TextColumn::make('details') ->label('详情'), ]) ->defaultSort('created_at', 'desc') ->paginationPageOptions([10, 25, 50]) ->striped(), // 开启条纹样式,贴近Shopify风格 ]), ]); }
样式优化提示
- 用
badge()给事件类型添加彩色标签,匹配Shopify状态标签风格 - 开启
striped()让表格行交替变色,提升可读性 - 设置
defaultSort按时间倒序,优先展示最新历史记录 - 添加筛选器,方便快速查找特定类型的历史事件
内容的提问来源于stack exchange,提问作者Ronak Panchal
相关产品推荐
相关产品推荐

