开始
表格字段(Column)类可以在 Filament\Tables\Columns
命令空间中找到。
你可以在 Livewire 组件中使用表格字段,将其放到 getTableColumns()
方法中:
protected function getTableColumns(): array
{
return [
// ...
];
}
如果你使用后台面板的资源或者关系管理器,你必须将它们放在 $table->columns()
方法中:
public static function table(Table $table): Table
{
return $table
->columns([
// ...
]);
}
可以使用静态 make()
方法,传入字段名创建表格字段。字段列名应该对应于模型的字段或者访问器。你可以使用"点语法"获取关联模型的字段。
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
TextColumn::make('author.name')
可用表格字段
Filament 自带两种类型字段 - 静态的和可编辑的。
静态字段展示数据给用户:
可编辑字段允许用户在不离开当前表格的情况下,更新数据库数据:
你也可以创建自定义字段。
设置标签
默认情况下,显示在表格表头的列字段标签,是由字段名生成的。你也可以使用 label()
方法自定义:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->label('Post title')
此外,你也可以使用 translateLabel()
方法自动翻译标签:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->translateLabel() // 相当于 `label(__('Title'))
排序
表格字段可以通过点击字段标签进行排序的。你必须使用 sortable()
方法使之可排序:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->sortable()
如果你使用访问器字段,你可以传入一个需要排序的数据库字段数组到 sortable()
中:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('full_name')->sortable(['first_name', 'last_name'])
你可以使用回调函数自定义怎样使用 Eloquent 查询进行排序:
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Eloquent\Builder;
TextColumn::make('full_name')
->sortable(query: function (Builder $query, string $direction): Builder {
return $query
->orderBy('last_name', $direction)
->orderBy('first_name', $direction);
})
如果一个字段是 sortable()
可排序的,你可以使用 getDefaultTableSortColumn()
和 getDefaultTableSortDirection()
方法对其进行默认排序:
protected function getDefaultTableSortColumn(): ?string
{
return 'full_name';
}
protected function getDefaultTableSortDirection(): ?string
{
return 'asc';
}
在 Session 中持久化排序
要将排序持久化到用户的 Session 中,请在 Livewire 组件上重写 shouldPersistTableSortInSession()
方法:
protected function shouldPersistTableSortInSession(): bool
{
return true;
}
搜索
使用表格的右上角的文本输入 框,可以搜索表格字段。要让字段可搜索,需要使用 searchable()
方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->searchable()
如果你使用了访问器字段,你可以传入数据库字段数组到 searchable()
中:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('full_name')->searchable(['first_name', 'last_name'])
你可以使用回调函数自定义如何使用 Eloquent 查询:
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Eloquent\Builder;
TextColumn::make('full_name')
->searchable(query: function (Builder $query, string $search): Builder {
return $query
->where('first_name', 'like', "%{$search}%")
->where('last_name', 'like', "%{$search}%");
})
单列搜索
使用 isIndividual
参数,你可以启用按列搜索:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->searchable(isIndividual: true)
如果使用 isIndividual
参数,你仍然可以使用整个表格的全局搜索输入框搜索该列。
要在保留单独搜索功能的同时,禁用全局搜索,你需要设置 isGlobal
参数:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->searchable(isIndividual: true, isGlobal: false)
你可以选择在查询字符串中持久化搜索:
protected $queryString = [
// ...
'tableColumnSearchQueries',
];
在 Session 中持久化搜索
要在用户 Session 中持久化表格或单列搜索,可以在 Livewire 组件中重写 shouldPersistTableSearchInSession()
或 shouldPersistTableColumnSearchInSession()
方法:
protected function shouldPersistTableSearchInSession(): bool
{
return true;
}
protected function shouldPersistTableColumnSearchInSession(): bool
{
return true;
}
单元格操作及 URL
当点击单元格时,你可以执行一个"操作(action)",或者打开一个网址。
执行操作
你可以使用 action()
方法并传入一个回调函数或 Livewire 方法名作为参数执行一个操作。方法接收一个 $record
参数用于自定义操作对应的行为:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->action(function (Post $record): void {
$this->dispatchBrowserEvent('open-post-edit-modal', [
'post' => $record->getKey(),
]);
})
操作模态框
你可以在 action()
方法中传入 Action
对象,打开操作模态框
use Filament\Tables\Actions\Action;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->action(
Action::make('select')
->requiresConfirmation()
->action(function (Post $record): void {
$this->dispatchBrowserEvent('select-post', [
'post' => $record->getKey(),
]);
}),
)
传入 action()
方法的 Action 对象名称必须是唯一的,用来与表格中的其他 Action 操作进行区分。
打开URL
你可以使用 url()
方法并传入一个回调函数或者静态URL作为参数来打开URL。回调函数接收一个 $record
参数可用于自定义 URL:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->url(fn (Post $record): string => route('posts.edit', ['post' => $record]))
你可以选择在新的标签页中打开 URL:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->url(fn (Post $record): string => route('posts.edit', ['post' => $record]))
->openUrlInNewTab()
设置默认值
你可以使用 default
方法,为带有 null
状态的字段设置一个默认值:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')->default('Untitled')