如何在Filament 3中选择日期范围并批量导出多表Excel数据
解决方案
1. 修改Reports页面类代码
替换原有的Reports.php代码为以下内容,添加日期范围属性、合并导出按钮并传递日期参数:
<?php namespace App\Filament\Pages; use App\Livewire\BillsReportsStats; use Filament\Actions\Action; use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\Grid; use Filament\Pages\Page; use Maatwebsite\Excel\Facades\Excel; use App\Exports\EmailReport; use App\Exports\MessagesReport; use App\Exports\WhatsappMessagesReport; use Symfony\Component\HttpFoundation\StreamedResponse; class Reports extends Page { protected static ?string $navigationIcon = 'heroicon-o-document-text'; protected static string $view = 'filament.pages.reports'; // 存储用户选择的起止日期 public ?string $startDate = null; public ?string $endDate = null; protected function getHeaderActions(): array { return [ Action::make('exportAll') ->label('导出全部报表') ->color('primary') ->icon('heroicon-o-cloud-arrow-down') ->form([ Grid::make(2) ->schema([ DatePicker::make('startDate') ->label('开始日期') ->required(), DatePicker::make('endDate') ->label('结束日期') ->required() ->afterOrEqual('startDate'), ]), ]) ->action('exportAllReports'), ]; } // 批量导出三个报表为压缩包 public function exportAllReports(): StreamedResponse { $tenantSlug = str(filament()->getTenant()->name)->slug(); return Excel::download([ new EmailReport($this->startDate, $this->endDate), new MessagesReport($this->startDate, $this->endDate), new WhatsappMessagesReport($this->startDate, $this->endDate), ], "{$tenantSlug}-all-reports.zip"); } protected function getHeaderWidgets(): array { return [ BillsReportsStats::class, ]; } }
2. 修改导出类以支持日期过滤
需要分别修改EmailReport.php、MessagesReport.php、WhatsappMessagesReport.php,让它们接收日期参数并添加范围过滤,以EmailReport为例:
<?php namespace App\Exports; use App\Models\Email; use Maatwebsite\Excel\Concerns\FromQuery; use Maatwebsite\Excel\Concerns\WithHeadings; class EmailReport implements FromQuery, WithHeadings { protected $startDate; protected $endDate; // 构造函数接收日期参数 public function __construct(string $startDate, string $endDate) { $this->startDate = $startDate; $this->endDate = $endDate; } public function query() { // 根据日期范围过滤数据,替换为你表中实际的时间字段(如sent_at) return Email::query() ->whereBetween('created_at', [$this->startDate . ' 00:00:00', $this->endDate . ' 23:59:59']) ->where('tenant_id', filament()->getTenant()->id); // 多租户过滤(按需保留) } public function headings(): array { // 返回你的表头字段,示例: return [ 'ID', '邮箱地址', '主题', '创建时间', // 其他自定义字段 ]; } }
MessagesReport和WhatsappMessagesReport执行相同逻辑,替换对应的模型和时间字段即可。
3. (可选)页面主体添加日期选择器
若希望在页面主体而非仅弹窗显示日期选择器,修改filament/pages/reports.blade.php:
<x-filament-panels::page> <x-filament-forms::form wire:submit="exportAllReports"> <x-filament-forms::grid :columns="2"> <x-filament-forms::field-wrapper label="开始日期"> {{ $this->form->getComponent('startDate') }} </x-filament-forms::field-wrapper> <x-filament-forms::field-wrapper label="结束日期"> {{ $this->form->getComponent('endDate') }} </x-filament-forms::field-wrapper> </x-filament-forms::grid> <x-filament-forms::actions :actions="$this->getHeaderActions()" /> </x-filament-forms::form> {{-- 原有页面内容 --}} @livewire(\App\Livewire\BillsReportsStats::class) </x-filament-panels::page>
关键说明
- 导出功能会将三个Excel文件打包为ZIP包,用户单次下载即可获取全部报表
- 日期选择器添加了结束日期不早于开始日期的验证规则
- 请根据数据库表的实际时间字段调整
whereBetween中的字段名
内容的提问来源于stack exchange,提问作者erroDecoder
相关产品推荐
相关产品推荐

