Languages

Version

Theme

表格 - 过滤器

自定义过滤器

自定义过滤器 Schema

你可以使用 Schema 组件创建自定义过滤器。自定义过滤器 Schma 中的数据,可以在 query() 回调中的 $data 数组中获取:

use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;
use Illuminate\Database\Eloquent\Builder;

Filter::make('created_at')
    ->schema([
        DatePicker::make('created_from'),
        DatePicker::make('created_until'),
    ])
    ->query(function (Builder $query, array $data): Builder {
        return $query
            ->when(
                $data['created_from'],
                fn (Builder $query, $date): Builder => $query->whereDate('created_at', '>=', $date),
            )
            ->when(
                $data['created_until'],
                fn (Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date),
            );
    })
The query() function can inject various utilities into the function as parameters. Learn more about utility injection.
Utility Type Parameter Description
Field Filament\Forms\Components\Field $component The current field component instance.
Data array<string, mixed> $data The data from the filter's form fields.
Get function Filament\Schemas\Components\Utilities\Get $get A function for retrieving values from the current form data. Validation is not run.
Livewire Livewire\Component $livewire The Livewire component instance.
Eloquent model FQN ?string<Illuminate\Database\Eloquent\Model> $model The Eloquent model FQN for the current schema.
Operation string $operation The current operation being performed by the schema. Usually create, edit, or view.
Query Illuminate\Database\Eloquent\Builder $query The Eloquent query builder to modify.
Raw state mixed $rawState The current value of the field, before state casts were applied. Validation is not run.
Eloquent record ?Illuminate\Database\Eloquent\Model $record The Eloquent record for the current schema.
State mixed $state The current value of the field. Validation is not run.
Table with custom filter schema

设置自定义过滤器字段的默认值

要在自定义过滤器表单中自定义默认值,你可以使用 default() 方法:

use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;

Filter::make('created_at')
    ->schema([
        DatePicker::make('created_from'),
        DatePicker::make('created_until')
            ->default(now()),
    ])

激活指示器

当过滤器出于激活状态时,在表格内容上方会显示一个指示器,说明表格的查询范围已限定。

Table with filter indicators

默认情况下,过滤器的标签被用作指示器。你可以使用 indicator() 方法对此进行重写:

use Filament\Tables\Filters\Filter;

Filter::make('is_admin')
    ->label('Administrators only?')
    ->indicator('Administrators')

如果你使用了自定义过滤器 Schema,那么你应该使用 indicateUsing() 来显示激活的指示器。

请注意:如果你的过滤器没有指示器,那么表格中激活过滤器数量的徽章计数将不包括该过滤器。

自定义激活指示器

并非所有的指示器都很简单,因此你可能需要使用 indicateUsing() 来自定义在哪个时候显示哪个指示器。

例如,如果你有一个自定义日期过滤器,那么你可以创建一个自定义指示器来格式化所选日期:

use Carbon\Carbon;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;

Filter::make('created_at')
    ->schema([DatePicker::make('date')])
    // ...
    ->indicateUsing(function (array $data): ?string {
        if (! $data['date']) {
            return null;
        }

        return 'Created at ' . Carbon::parse($data['date'])->toFormattedDateString();
    })

多个激活指示器

你甚至可以通过返回 Indicator 对象数组,一次性渲染多个指示器。如果你有关联不同指示器的不同字段,你应该在 Indicator 对象上使用 removeField() 对字段进行设置,以确保过滤器移除时字段对应的字段被重置:

use Carbon\Carbon;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\Indicator;

Filter::make('created_at')
    ->schema([
        DatePicker::make('from'),
        DatePicker::make('until'),
    ])
    // ...
    ->indicateUsing(function (array $data): array {
        $indicators = [];

        if ($data['from'] ?? null) {
            $indicators[] = Indicator::make('Created from ' . Carbon::parse($data['from'])->toFormattedDateString())
                ->removeField('from');
        }

        if ($data['until'] ?? null) {
            $indicators[] = Indicator::make('Created until ' . Carbon::parse($data['until'])->toFormattedDateString())
                ->removeField('until');
        }

        return $indicators;
    })

防止指示器被移除

Indicator 对象上使用 removable(false) 你可以阻止用户移除指示器:

use Carbon\Carbon;
use Filament\Tables\Filters\Indicator;

Indicator::make('Created from ' . Carbon::parse($data['from'])->toFormattedDateString())
    ->removable(false)
Edit on GitHub

Still need help? Join our Discord community or open a GitHub discussion

Previous
查询构造器