概述
简介
过滤器允许你在数据上定义特定的约束条件,并允许用户设置查询范围,以查找他们需要的信息。你可以将其放在 $table->filters() 中。
过滤器可以使用 make() 静态方法创建,并传递其唯一名称。你应该传入一个回调函数给 query(),以设置过滤器的查询范围:
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
public function table(Table $table): Table
{
return $table
->filters([
Filter::make('is_featured')
->query(fn (Builder $query): Builder => $query->where('is_featured', true))
// ...
]);
}

可用过滤器
默认情况下,使用 Filter::make() 方法将会渲染一个复选框表单组件。当复选框选中时,查询(query())会被激活。
- 你也可以使用 Toggle 替换 checkbox。
- 你也可以使用 Select 过滤器,允许用户从选项列表中选择,并使用选中的选项进行过滤。
- 你还可以三元过滤器替换复选框,以允许用户在三种状态(通常为 "true"、"false" 及 "空 值")之间选择。这对于过滤布尔值字段非常有用。
- 垃圾过滤器是一个预制的三元过滤器,允许你过滤可软删除的记录。
- 查询构造器(Query builder)允许用户使用用于联合约束条件的高级用户界面创建复杂的过滤器。
- 你也可以使用其他表单字段创建自定义过滤器。
设置标签
默认情况下,过滤器的标签是基于过滤器标签生成。使用 label() 方法,可以自定义标签:
use Filament\Tables\Filters\Filter;
Filter::make('is_featured')
->label('Featured')
As well as allowing a static value, the label() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.
Learn more about utility injection.| Utility | Type | Parameter | Description |
|---|---|---|---|
| Filter | Filament\Tables\Filters\BaseFilter | $filter | The current filter instance. |
| Livewire | Livewire\Component | $livewire | The Livewire component instance. |
| Table | Filament\Tables\Table | $table | The current table instance. |
如果你希望使用本地化翻译字符串功能,那么以这种方式自定义标签会很有用:
use Filament\Tables\Filters\Filter;
Filter::make('is_featured')
->label(__('filters.is_featured'))
自定义过滤器 Schema
默认情况下,使用 Filter 类创建过滤器时,会渲染一个 复选框表单组件。当勾选复选框时,query() 函数将应用于表格的查询,从而限定表格中记录查询范围;当取消勾选时,该 query() 函数将从表格查询中移除。
过滤器完全是基于 Filament 表单字段构建的。它们可以渲染任意组合的表单字段,用户通过与这些字段交互来过滤表格数据。
使用切换按钮替代复选框
管理过滤器所用表单字段的最简单示例,就是使用 toggle() 方法将 复选框 替换为 切换按钮:
use Filament\Tables\Filters\Filter;
Filter::make('is_featured')
->toggle()

自定义内置过滤器表单字段
无论你使用的是 Checkbox、Toggle还是 Select,你可以使用 modifyFormFieldUsing() 方法,自定义过滤器使用的内置表单字段。该方法接受一个带 $field 参数的函数,此参数让你可以访问表单字段,以进行自定义:
use Filament\Forms\Components\Checkbox;
use Filament\Tables\Filters\Filter;
Filter::make('is_featured')
->modifyFormFieldUsing(fn (Checkbox $field) => $field->inline(false))
The function passed to modifyFormFieldUsing() can inject various utilities as parameters.
Learn more about utility injection.| Utility | Type | Parameter | Description |
|---|---|---|---|
| Field | Filament\Forms\Components\Field | $field | The field object to modify. |
| Filter | Filament\Tables\Filters\BaseFilter | $filter | The current filter instance. |
| Livewire | Livewire\Component | $livewire | The Livewire component instance. |
| Table | Filament\Tables\Table | $table | The current table instance. |
默认应用过滤器
使用 default() 方法,你可以设置默认启用过滤器:
use Filament\Tables\Filters\Filter;
Filter::make('is_featured')
->default()
如果你使用了 Select 过滤器,请查阅“默认应用 Select 过滤器”相关文档。
在用户 Session 中持久化过滤器
要在用户 Session 中持久化表格过滤器,请使用 persistFiltersInSession() 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->filters([
// ...
])
->persistFiltersInSession();
}

