Skip to content
全部文档

自定义筛选器

自定义筛选器 Schema

你可以使用 schema 组件 创建自定义筛选器。自定义筛选器 schema 中的数据可在 query() 回调的 $data 数组中获取:

php
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),
            );
    })

TIP

query() 函数可以将各种工具作为参数注入到函数中。

带自定义筛选器 schema 的表格带自定义筛选器 schema 的表格

为自定义筛选器字段设置默认值

要自定义自定义筛选器 schema 中字段的默认值,可以使用 default() 方法:

php
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()),
    ])

活动指示器

当筛选器处于活动状态时,会在表格内容上方显示指示器,表明表格查询已被限定范围。

带筛选器指示器的表格带筛选器指示器的表格

默认情况下,筛选器的标签会用作指示器。你可以使用 indicator() 方法覆盖它:

php
use Filament\Tables\Filters\Filter;

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

若使用自定义筛选器 schema,应使用 indicateUsing() 来显示活动指示器。

请注意:若筛选器没有指示器,则表格中「活动筛选器数量」的徽章计数将不包含该筛选器。

自定义活动指示器

并非所有指示器都很简单,因此你可能需要使用 indicateUsing() 来自定义任意时刻应显示哪些指示器。

例如,若有自定义日期筛选器,你可以创建格式化所选日期的自定义指示器:

php
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() 方法设置字段,以确保移除筛选器时重置正确的字段:

php
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) 阻止用户移除指示器:

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

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