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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:20:14