如何在Filament中使用DomPDF导出过滤后的表格数据?
解决Filament过滤后数据导出PDF的问题
核心问题分析
你之前的代码存在几个关键错误:
- 错误调用
$record->getFilters():单条模型实例没有getFilters方法,过滤参数存储在当前请求的Query参数中 - 未正确传递过滤参数:静态变量和自定义方法无法获取Filament的实时过滤状态
- PDF控制器未应用过滤逻辑:直接调用
Transaction::all()导出了全部数据,没有使用过滤条件
正确解决方案
1. 修改TransactionResource添加导出按钮
在表格配置中添加头部动作按钮,直接携带当前页面的所有过滤、搜索、排序参数到PDF路由:
// app/Filament/Resources/TransactionResource.php use Filament\Tables\Actions\Action; public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('owner.name')->sortable()->searchable(), TextColumn::make('department.name')->sortable()->searchable(), TextColumn::make('category.category_code')->sortable()->searchable(), TextColumn::make('description')->sortable()->searchable(), TextColumn::make('receipt_number')->sortable()->searchable(), TextColumn::make('receipt_date')->date()->sortable(), TextColumn::make('receipt_amount')->sortable()->searchable(), ]) ->filters([ SelectFilter::make('category')->relationship('category', 'name'), SelectFilter::make('subcategory')->relationship('subcategory', 'name'), SelectFilter::make('department')->relationship('department', 'name'), SelectFilter::make('owner')->relationship('owner', 'name'), Filter::make('receipt_date') ->form([ Forms\Components\DatePicker::make('receipt_date_from'), Forms\Components\DatePicker::make('receipt_date_to'), ]) ->query(function (Builder $query, array $data): Builder { return $query ->when( $data['receipt_date_from'], fn (Builder $query, $date): Builder => $query->whereDate('receipt_date', '>=', $date), ) ->when( $data['receipt_date_to'], fn (Builder $query, $date): Builder => $query->whereDate('receipt_date', '<=', $date), ); }), ]) ->actions([ Tables\Actions\EditAction::make(), ]) ->bulkActions([ Tables\Actions\DeleteBulkAction::make(), ]) // 添加导出PDF的头部按钮 ->headerActions([ Action::make('exportPdf') ->label('导出PDF') // 携带当前所有请求参数(过滤、搜索、排序) ->url(fn () => route('report.pdf', request()->query())) ->openUrlInNewTab(), ]); }
2. 修改PDFReportController应用过滤逻辑
接收请求参数并构建对应查询,获取过滤后的数据集:
// app/Http/Controllers/PDFReportController.php <?php namespace App\Http\Controllers; use App\Models\Transaction; use Illuminate\Http\Request; use PDF; class PDFReportController extends Controller { public function downloadReport(Request $request) { $query = Transaction::query(); // 处理全局搜索 if ($search = $request->get('search')) { $query->where(function ($q) use ($search) { $q->whereHas('owner', fn ($subQ) => $subQ->where('name', 'like', "%{$search}%")) ->orWhereHas('department', fn ($subQ) => $subQ->where('name', 'like', "%{$search}%")) ->orWhereHas('category', fn ($subQ) => $subQ->where('category_code', 'like', "%{$search}%")) ->orWhere('description', 'like', "%{$search}%") ->orWhere('receipt_number', 'like', "%{$search}%") ->orWhere('receipt_amount', 'like', "%{$search}%"); }); } // 处理分类过滤器 $filters = $request->get('filter', []); if (isset($filters['category'])) { $query->whereHas('category', fn ($q) => $q->where('id', $filters['category'])); } // 处理子分类过滤器 if (isset($filters['subcategory'])) { $query->whereHas('subcategory', fn ($q) => $q->where('id', $filters['subcategory'])); } // 处理部门过滤器 if (isset($filters['department'])) { $query->whereHas('department', fn ($q) => $q->where('id', $filters['department'])); } // 处理所有者过滤器 if (isset($filters['owner'])) { $query->whereHas('owner', fn ($q) => $q->where('id', $filters['owner'])); } // 处理日期范围 if (isset($filters['receipt_date'])) { $dateFilter = $filters['receipt_date']; if (!empty($dateFilter['receipt_date_from'])) { $query->whereDate('receipt_date', '>=', $dateFilter['receipt_date_from']); } if (!empty($dateFilter['receipt_date_to'])) { $query->whereDate('receipt_date', '<=', $dateFilter['receipt_date_to']); } } // 处理排序 if ($sort = $request->get('sort')) { $direction = $request->get('direction', 'asc'); $query->orderBy($sort, $direction); } // 获取过滤后的数据集 $transactions = $query->get(); // 生成PDF(确保视图接收$transactions变量) $pdf = PDF::loadView('reportPDF', compact('transactions')); $pdf->set_paper('letter', 'landscape'); return $pdf->stream('report.pdf'); } }
3. 配置路由
在routes/web.php中添加PDF导出路由:
use App\Http\Controllers\PDFReportController; Route::get('/report/pdf', [PDFReportController::class, 'downloadReport'])->name('report.pdf');
4. 完善PDF视图(reportPDF.blade.php)
确保视图正确遍历过滤后的$transactions数据:
<!DOCTYPE html> <html> <head> <title>交易报表</title> </head> <body> <h1>过滤后交易报表</h1> <table border="1" cellpadding="8" cellspacing="0"> <thead> <tr> <th>所有者</th> <th>部门</th> <th>分类编码</th> <th>描述</th> <th>收据编号</th> <th>收据日期</th> <th>金额</th> </tr> </thead> <tbody> @foreach($transactions as $transaction) <tr> <td>{{ $transaction->owner->name }}</td> <td>{{ $transaction->department->name }}</td> <td>{{ $transaction->category->category_code }}</td> <td>{{ $transaction->description }}</td> <td>{{ $transaction->receipt_number }}</td> <td>{{ $transaction->receipt_date->format('Y-m-d') }}</td> <td>{{ $transaction->receipt_amount }}</td> </tr> @endforeach </tbody> </table> </body> </html>
验证效果
- 在Filament交易列表页面应用过滤条件,表格显示筛选后的记录
- 点击顶部的「导出PDF」按钮,新标签页会生成包含当前过滤结果的PDF文档
内容的提问来源于stack exchange,提问作者syed
相关产品推荐
相关产品推荐

