Laravel Filament Admin中如何将表单数据发送至外部控制器而非数据库
用Filament表单实现数据库查询并返回结果的步骤
首先你表单里两个日期选择器用了同一个字段名transaction_date,会冲突,先改成不同的:
public static function form(Form $form): Form { return $form ->schema([ DatePicker::make('start_date')->label('开始日期')->columnSpanFull(), DatePicker::make('end_date')->label('结束日期')->columnSpanFull(), Select::make('report_type') ->label('选择报告类型') ->columnSpanFull() ->options([ 'total_fee' => '总手续费', 'total_amount' => '总金额', ]), ]); }
接下来按以下步骤操作:
创建自定义查询页面
在你的Filament资源目录下新建一个页面,比如ReportPage.php,继承Filament的Page类并实现表单交互:namespace App\Filament\Resources\YourResource\Pages; use App\Filament\Resources\YourResource; use Filament\Pages\Page; use Filament\Forms\Components\Form; use Filament\Forms\Contracts\HasForms; use Filament\Forms\Concerns\InteractsWithForms; class ReportPage extends Page implements HasForms { use InteractsWithForms; protected static string $view = 'filament.resources.your-resource.pages.report-page'; public ?array $data = []; public $result = null; public function mount(): void { $this->form->fill(); } public function form(Form $form): Form { return $form ->schema([ DatePicker::make('start_date')->label('开始日期')->required(), DatePicker::make('end_date')->label('结束日期')->required(), Select::make('report_type') ->label('选择报告类型') ->options([ 'total_fee' => '总手续费', 'total_amount' => '总金额', ]) ->required(), ]) ->statePath('data'); } // 处理表单提交的查询逻辑 public function submit() { $validated = $this->form->getState(); // 替换成你的模型类,根据条件查询数据库 $query = \App\Models\YourTransactionModel::query() ->whereBetween('transaction_date', [$validated['start_date'], $validated['end_date']]); if ($validated['report_type'] === 'total_fee') { $this->result = $query->sum('fee'); } else { $this->result = $query->sum('amount'); } } }创建页面视图文件
在resources/views/filament/resources/your-resource/pages目录下新建report-page.blade.php,用来渲染表单和查询结果:<x-filament-panels::page> <x-filament-forms::form wire:submit="submit"> {{ $this->form }} <x-filament-forms::actions :actions="$this->getFormActions()" :full-width="$this->hasFullWidthFormActions()" /> </x-filament-forms::form> @if($result !== null) <div class="mt-6 p-4 bg-gray-50 rounded-lg"> <h3 class="text-lg font-semibold mb-2">查询结果</h3> <p class="text-xl">{{ $result }}</p> </div> @endif </x-filament-panels::page>将页面添加到资源路由
在你的资源类(比如YourResource.php)的getPages方法里注册这个自定义页面:public static function getPages(): array { return [ 'index' => Pages\ListYourModels::route('/'), 'create' => Pages\CreateYourModel::route('/create'), 'edit' => Pages\EditYourModel::route('/{record}/edit'), 'report' => Pages\ReportPage::route('/report'), // 添加这一行 ]; }添加导航入口
在资源类的getNavigationItems方法里添加菜单项,方便从侧边栏访问:public static function getNavigationItems(): array { return array_merge(parent::getNavigationItems(), [ \Filament\Navigation\NavigationItem::make('报告查询') ->icon('heroicon-o-document-text') ->route(static::getRouteName() . '.report'), ]); }
完成以上步骤后,你就能通过Filament的表单提交查询条件,后端自动处理数据库查询并返回计算结果展示在页面上。
内容的提问来源于stack exchange,提问作者faba
相关产品推荐
相关产品推荐

