跳到主要内容
版本:4.x

Select filters

简介

通常,你可能希望使用 Selcet 字段而非复选框。你希望用户可以根据一组预定义选项过滤列字段时,尤其如此。为此,你可以使用 SelectFilter 类创建一个过滤器:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])

通过 options() 传递给过滤器的选项,与传递给 Select 字段的方式一致:

除了允许静态值之外,options() 方法也可以接受函数来动态计算其值。你可以将多个 utility 作为参数注入到函数中。Learn more about utility injection.
UtilityTypeParameterDescription
FilterFilament\Tables\Filters\BaseFilter$filterThe current filter instance.
LivewireLivewire\Component$livewireThe Livewire component instance.
TableFilament\Tables\Table$tableThe current table instance.

自定义 Select 过滤器使用的字段

Select 过滤器不要求自定义 query() 方法。用于设置查询范围的字段名是过滤器的名称。如果要对此进行自定义,请使用 attribute() 方法:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->attribute('status_id')
除了允许静态值之外,attribute() 方法也可以接受函数来动态计算其值。你可以将多个 utility 作为参数注入到函数中。Learn more about utility injection.
UtilityTypeParameterDescription
FilterFilament\Tables\Filters\BaseFilter$filterThe current filter instance.
LivewireLivewire\Component$livewireThe Livewire component instance.
TableFilament\Tables\Table$tableThe current table instance.

多选 Select 过滤器

这将允许用户选择多个选项,将该过滤器应用到表格。比如,状态过滤器可能向用户展示一些状态选项供用户选取并供表格过滤使用。当用户选择多个选项时,表格会过滤显示匹配所选选项的记录。你可以使用 multiple() 方法启用该行为:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
->multiple()
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])

关联 Select 过滤器

Select 过滤器也能够基于关联自动填充。比如,如果表有一个 author 关联,它有一个 name 字段,你可以使用 relationship() 过滤属于某个作者(author)的记录:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('author')
->relationship('author', 'name')

预加载 Select 过滤器关联选项

如果你想在页面加载时填充可搜索选项,而不是在用户搜索时加载,你可以使用 preload() 方法:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('author')
->relationship('author', 'name')
->searchable()
->preload()

过滤空关联

默认情况下,一旦选中一个选项,所有有空关联的记录都会从结果中排除出去。如果你想另外为用户引入一个“无(None)”选项,你可以在 relationship() 方法中使用 hasEmptyOption() 参数,它将会包含所有没有关联的记录:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('author')
->relationship('author', 'name', hasEmptyOption: true)

你可以使用 emptyRelationshipOptionLabel() 方法重命名 "None" 选项:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('author')
->relationship('author', 'name', hasEmptyOption: true)
->emptyRelationshipOptionLabel('No author')

自定义 Select 过滤器的关联查询

通过 relationship() 方法的第三个参数,你可以自定义用于检索选项的数据库查询:

use Filament\Tables\Filters\SelectFilter;
use Illuminate\Database\Eloquent\Builder;

SelectFilter::make('author')
->relationship('author', 'name', fn (Builder $query) => $query->withTrashed())

搜索 Select 过滤器的选项

使用 searchable() 方法,你可以启用搜索输入框,以方便访问选项:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('author')
->relationship('author', 'name')
->searchable()

禁用占位符选择

使用 selectablePlaceholder() 方法,你可以移除占位符(空值选项),它禁用了过滤器使所有选项都适用:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->default('draft')
->selectablePlaceholder(false)

默认应用 Select 过滤器

使用 default() 方法,你可以将 Select 过滤器设置为默认启用。如果使用单选 Select 过滤器,default() 方法接受一个单一选项值。如果使用 multiple() 多选 Select 过滤器,default() 方法接受一个选项值数组:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->default('draft')

SelectFilter::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->multiple()
->default(['draft', 'reviewing'])
除了允许静态值之外,default() 方法也可以接受函数来动态计算其值。你可以将多个 utility 作为参数注入到函数中。Learn more about utility injection.
UtilityTypeParameterDescription
FilterFilament\Tables\Filters\BaseFilter$filterThe current filter instance.
LivewireLivewire\Component$livewireThe Livewire component instance.
TableFilament\Tables\Table$tableThe current table instance.