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

Laravel Filament表格过滤器添加触发按钮的实现求助

解决方案

要实现点击按钮才执行表格过滤,需修改过滤器的核心逻辑,关闭实时触发并添加手动提交按钮,具体操作如下:

关键修改点

  1. 移除所有表单组件的->reactive():该方法会让输入内容实时同步并触发查询,是服务器压力大的直接原因。
  2. 添加手动提交按钮:在过滤器表单末尾新增提交按钮,仅点击时触发查询。
  3. 禁用自动提交:明确指定过滤器仅响应手动按钮操作,不自动执行查询。

修改后的完整代码

Filter::make('filter')
    ->form([
        Grid::make(4)
            ->schema([
                Select::make('DocumentType')
                    ->options([
                        'CONTRATO' => 'CONTRATO',
                        'DOCUMENTO' => 'DOCUMENTO',
                    ])->label('Tipo de Digitalização')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Rg') || $get('Cpf') || $get('Codigo') || $get('Sequencial') || $get('date_init') || $get('date_end');
                    }),
                
                Forms\Components\TextInput::make('FullName')
                    ->label('Nome')
                    ->hidden(function (callable $get){
                        return $get('Cpf') || $get('Rg') || $get('DocumentType') || $get('Codigo') || $get('Sequencial') || $get('date_init') || $get('date_end');
                    }),

                Forms\Components\DateTimePicker::make('date_init')
                    ->label('Digitalizado a partir de')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Rg') || $get('DocumentType') || $get('Codigo') || $get('Sequencial') || $get('Cpf');
                    }),

                Forms\Components\DateTimePicker::make('date_end')
                    ->label('Digitalizado até')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Rg') || $get('DocumentType') || $get('Codigo') || $get('Sequencial') || $get('Cpf');
                    }),
            ]),
        Grid::make(4)
            ->schema([                           
                Forms\Components\TextInput::make('Cpf')
                    ->label('CPF')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Rg') || $get('DocumentType') || $get('Codigo') || $get('Sequencial') || $get('date_init') || $get('date_end');
                    }),

                Forms\Components\TextInput::make('Rg')
                    ->label('RG')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Cpf') || $get('DocumentType') || $get('Codigo') || $get('Sequencial') || $get('date_init') || $get('date_end');
                    }),

                Forms\Components\TextInput::make('Codigo')
                    ->label('Código')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Rg') || $get('DocumentType') || $get('Cpf') || $get('Sequencial') || $get('date_init') || $get('date_end');
                    }),

                Forms\Components\TextInput::make('Sequencial')
                    ->label('Sequencial')
                    ->hintColor('primary')
                    ->hidden(function (callable $get){
                        return $get('FullName') || $get('Rg') || $get('DocumentType') || $get('Codigo') || $get('Cpf') || $get('date_init') || $get('date_end');
                    }),
            ]),
        // 添加手动提交按钮
        Forms\Components\Actions::make([
            Forms\Components\Actions\Action::make('submit')
                ->label('Filtrar')
                ->submit('filter')
                ->color('primary'),
        ])->alignment('right'),
    ])
    // 禁用自动提交,仅响应按钮点击
    ->autoSubmit(false)
    ->query(function (Builder $query, array $data): Builder {
        return $query
            ->when(
                $data['DocumentType'],
                fn (Builder $query, $value): Builder => $query->where('DocumentType', '=', $value),
            )->when(
                $data['FullName'],
                fn (Builder $query, $value): Builder => $query->whereRaw(['$text' => ['$search' => "\"{$value}\""]])
            )->when(
                $data['Codigo'],
                fn (Builder $query, $value): Builder => $query->whereRaw(['$text' => ['$search' => "\"{$value}\""]])
            )->when(
                $data['Rg'],
                fn (Builder $query, $value): Builder => $query->whereRaw(['$text' => ['$search' => "\"{$value}\""]])
            )->when(
                $data['Sequencial'],
                fn (Builder $query, $value): Builder => $query->whereRaw(['$text' => ['$search' => "\"{$value}\""]])
            )->when(
                $data['Cpf'],
                fn (Builder $query, $value): Builder => $query->whereRaw(['$text' => ['$search' => "\"{$value}\""]])
            )
            ->when(
                $data['date_init'],
                fn (Builder $query, $value): Builder => $query->where('created_at', '>=', new DateTime($value))
            )->when(
                $data['date_end'],
                fn (Builder $query, $value): Builder => $query->where('created_at', '<=', new DateTime($value))
            );
    })

修改说明

  • 移除->reactive()后,表单组件不再实时同步状态,避免输入字符时频繁触发MongoDB查询。
  • 新增的"Filtrar"按钮是触发查询的唯一入口,用户需先填写过滤条件再点击按钮执行查询。
  • ->autoSubmit(false)强制关闭Filament的自动提交逻辑,确保仅响应手动操作。
  • 优化了MongoDB查询的数组写法,保持功能不变的同时让代码更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:22:31