自定义筛选器
自定义筛选器 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 中字段的默认值,可以使用 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)