自定义过滤器
自定义过滤器 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 <code>create</code>, <code>edit</code>, or <code>view</code>. |
| 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. |

设置自定义过滤器字段的默认值
要在自定义过滤器表单中自定义默认值,你可以使用 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()),
])
激活指示器
当过滤器出于激活状态时,在表格内容上方会显示一个指示器,说明表格的查询范围已限定。

默认情况下,过滤器的标签被用作指示器。你可以使用 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();
})

