You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>

验证效果

  1. 在Filament交易列表页面应用过滤条件,表格显示筛选后的记录
  2. 点击顶部的「导出PDF」按钮,新标签页会生成包含当前过滤结果的PDF文档

内容的提问来源于stack exchange,提问作者syed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:40:55