表格 - 过滤器

Select 过滤器

简介

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

use Filament\Tables\Filters\SelectFilter;

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

传递给过滤器的 options() 与传递给 Select 字段 的 options() 相同。

Table with select filter
除了允许静态值之外,options() 方法也可以接受函数来动态计算其值。你可以将各种 utility 作为参数注入到函数中。 了解更多 utility 注入详情。
Utility 类型 参数 描述
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.

NOTE

options() 仅是一种 UI 交互设计,而非授权边界。虽然该列表限制了下拉菜单的显示内容,但在执行筛选逻辑之前,系统并不会校验提交的值是否在列表中。如果用户篡改 Livewire 请求,便可向过滤器状态提交任意值——apply() 方法会将该值直接传递给查询构建器中的 whereIn 或 where 子句。

如果你使用 options() 是为了向特定用户群组隐藏某些值(例如,对非管理员用户隐藏 archived 状态的记录),请转而通过限制表格查询本身来实现——例如使用 modifyQueryUsing() 或在资源上定义全局查询范围限定。这样,无论过滤器提交什么值,受限的记录都将无法被访问。

自定义 Select 过滤器使用的列

Select 过滤器无需自定义 query() 方法。用于限定查询范围的列名即为过滤器的名称。若要自定义该列名,可以使用 attribute() 方法:

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
    ->options([
        'draft' => 'Draft',
        'reviewing' => 'Reviewing',
        'published' => 'Published',
    ])
    ->attribute('status_id')
除了允许静态值之外,attribute() 方法也可以接受函数来动态计算其值。你可以将各种 utility 作为参数注入到函数中。 了解更多 utility 注入详情。
Utility 类型 参数 描述
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.

多选 Select 过滤器

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

use Filament\Tables\Filters\SelectFilter;

SelectFilter::make('status')
    ->multiple()
    ->options([
        'draft' => 'Draft',
        'reviewing' => 'Reviewing',
        'published' => 'Published',
    ])
Table with a multi-select filter

关联 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 作为参数注入到函数中。 了解更多 utility 注入详情。
Utility 类型 参数 描述
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.
Edit on GitHub

Still need help? Join our Discord community or open a GitHub discussion

Previous
概述