Skip to content
全部文档

选择筛选器

简介

通常你会希望使用选择字段而不是复选框。尤其是当你要根据一组预定义选项筛选某列时。为此,可以使用 SelectFilter 类创建筛选器:

php
use Filament\Tables\Filters\SelectFilter;

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

传给筛选器的 options() 与传给选择字段的选项相同。

带选择筛选器的表格带选择筛选器的表格

TIP

除静态值外,options() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。

DANGER

options() 只是 UI 呈现手段,不是授权边界。选项列表限制下拉框显示的内容,但筛选器运行前不会对照该列表校验提交值。篡改 Livewire 请求的用户可以向筛选器状态提交任意值——apply() 会将其直接传入查询的 whereIn/where

若你用 options() 向某类用户隐藏某些值(例如对非管理员隐藏 archived),应改为限定表格查询本身——例如使用 modifyQueryUsing() 或资源上的全局作用域——这样无论筛选器提交什么,受限制的行都不可达。

自定义选择筛选器使用的列

选择筛选器不需要自定义 query() 方法。用于限定查询范围的列名即为筛选器名称。要自定义它,可以使用 attribute() 方法:

php
use Filament\Tables\Filters\SelectFilter;

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

TIP

除静态值外,attribute() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。

多选筛选器

这类筛选器允许用户选择多个选项来筛选表格。例如,状态筛选器可以向用户展示若干状态选项供选择并筛选表格。当用户选择多个选项时,表格会筛选出匹配任一所选选项的记录。可使用 multiple() 方法启用此行为:

php
use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
    ->multiple()
    ->options([
        'draft' => 'Draft',
        'reviewing' => 'Reviewing',
        'published' => 'Published',
    ])
带多选筛选器的表格带多选筛选器的表格

关联选择筛选器

选择筛选器也可以根据关联自动填充选项。例如,若表格有带 name 列的 author 关联,你可以使用 relationship() 筛选属于某作者的记录:

php
use Filament\Tables\Filters\SelectFilter;

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

预加载选择筛选器关联选项

若希望在页面加载时从数据库填充可搜索选项,而不是在用户搜索时再填充,可以使用 preload() 方法:

php
use Filament\Tables\Filters\SelectFilter;

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

筛选空关联

默认情况下,选择某个选项后,所有关联为空的记录会被排除在结果之外。若想额外提供一个「None」选项供用户选择(包含所有没有关联的记录),可以使用 relationship() 方法的 hasEmptyOption() 参数:

php
use Filament\Tables\Filters\SelectFilter;

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

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

php
use Filament\Tables\Filters\SelectFilter;

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

自定义选择筛选器关联查询

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

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

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

搜索选择筛选器选项

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

php
use Filament\Tables\Filters\SelectFilter;

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

禁用占位符选择

你可以使用 selectablePlaceholder() 方法移除占位符(null 选项),从而禁用该「清空」能力,使筛选始终应用某个选项:

php
use Filament\Tables\Filters\SelectFilter;

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

默认应用选择筛选器

你可以使用 default() 方法将选择筛选器设为默认启用。若为单选筛选器,default() 接受单个选项值;若为 multiple() 多选筛选器,default() 接受选项值数组:

php
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'])

TIP

除静态值外,default() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。