Laravel Filament表格过滤器添加触发按钮的实现求助
解决方案
要实现点击按钮才执行表格过滤,需修改过滤器的核心逻辑,关闭实时触发并添加手动提交按钮,具体操作如下:
关键修改点
- 移除所有表单组件的
->reactive():该方法会让输入内容实时同步并触发查询,是服务器压力大的直接原因。 - 添加手动提交按钮:在过滤器表单末尾新增提交按钮,仅点击时触发查询。
- 禁用自动提交:明确指定过滤器仅响应手动按钮操作,不自动执行查询。
修改后的完整代码
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
相关产品推荐
相关产品推荐

