概述
简介
列类位于 Filament\Tables\Columns 命名空间中。它们放在 $table->columns() 方法内。Filament 内置了多种列:
- [文本列](/5.x/tables/columns/text)
- [图标列](/5.x/tables/columns/icon)
- [图片列](/5.x/tables/columns/image)
- [颜色列](/5.x/tables/columns/color)
可编辑列允许用户在不离开表格的情况下更新数据库中的数据:
- [选择列](/5.x/tables/columns/select)
- [开关列](/5.x/tables/columns/toggle)
- [文本输入列](/5.x/tables/columns/text-input)
- [复选框列](/5.x/tables/columns/checkbox)
你也可以创建自己的自定义列,以任意方式显示数据。
列可使用静态 make() 方法创建,并传入其唯一名称。通常,列名对应 Eloquent 模型上的属性名。你可以使用「点语法」(dot notation)访问关联关系中的属性:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
TextColumn::make('author.name')列内容(状态)
列起初可能感觉有些神奇,但它们被设计为简单易用,并针对显示 Eloquent 记录中的数据进行了优化。尽管如此,它们很灵活,你可以从任何来源显示数据,而不仅仅是 Eloquent 记录属性。
列显示的数据称为其「状态」(state)。使用面板资源时,表格知道它正在显示的记录。这意味着列的状态根据记录上该属性的值设置。例如,如果该列用于 PostResource 的表格中,则会显示当前帖子的 title 属性值。
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')若要访问存储在关联关系中的值,可以使用「点语法」。你想访问数据的关联关系名称在前,后跟一个点,然后是属性名:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('author.name')你也可以使用「点语法」访问 Eloquent 模型上 JSON / 数组列中的值。属性名在前,后跟一个点,然后是你想读取的 JSON 对象的键:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('meta.title')设置列的状态
你可以使用 state() 方法向列传入自己的状态:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->state('Hello, world!')TIP
state() 方法也接受函数以动态计算状态。你可以将各种工具作为参数注入到函数中。
设置列的默认状态
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->default('Untitled')列为空时添加占位文本
有时你可能想为状态为空的列显示占位文本,其样式为较浅的灰色文字。这与默认值不同,因为占位符始终是文本,不会被当作真实状态处理。
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->placeholder('Untitled')

显示关联关系中的数据
你可以使用「点语法」访问关联关系中的列。关联关系名称在前,后跟一个点,然后是要显示的列名:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('author.name')统计关联数量
若要在列中统计关联记录的数量,可以使用 counts() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('users_count')->counts('users')在此示例中,users 是要统计的关联关系名称。列名必须是 users_count,因为这是 Laravel 用于存储结果的约定。
若要在统计前对关联关系进行限定,可以向该方法传入一个数组,其中键是关联关系名称,值是用于限定 Eloquent 查询的函数:
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Eloquent\Builder;
TextColumn::make('users_count')->counts([
'users' => fn (Builder $query) => $query->where('is_active', true),
])判断关联是否存在
若只想在列中指示关联记录是否存在,可以使用 exists() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('users_exists')->exists('users')在此示例中,users 是要检查是否存在的关联关系名称。列名必须是 users_exists,因为这是 Laravel 用于存储结果的约定。
若要在检查存在性前对关联关系进行限定,可以向该方法传入一个数组,其中键是关联关系名称,值是用于限定 Eloquent 查询的函数:
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Eloquent\Builder;
TextColumn::make('users_exists')->exists([
'users' => fn (Builder $query) => $query->where('is_active', true),
])聚合关联
Filament 提供了多种聚合关联字段的方法,包括 avg()、max()、min() 和 sum()。例如,若要在列中显示所有关联记录上某字段的平均值,可以使用 avg() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('users_avg_age')->avg('users', 'age')在此示例中,users 是关联关系名称,age 是被求平均的字段。列名必须是 users_avg_age,因为这是 Laravel 用于存储结果的约定。
若要在聚合前对关联关系进行限定,可以向该方法传入一个数组,其中键是关联关系名称,值是用于限定 Eloquent 查询的函数:
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Eloquent\Builder;
TextColumn::make('users_avg_age')->avg([
'users' => fn (Builder $query) => $query->where('is_active', true),
], 'age')设置列的标签
默认情况下,显示在表格表头中的列标签由列名生成。你可以使用 label() 方法自定义:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->label('Full name')TIP
除静态值外,label() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。
以这种方式自定义标签,在你希望使用本地化翻译字符串时很有用:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->label(__('columns.name'))排序
列可以通过点击列标签进行排序。要使列可排序,必须使用 sortable() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->sortable()

Filament 会使用列名向 Eloquent 查询应用 orderBy() 子句。这适用于列名与数据库列名匹配的简单情况。它也可以处理关联关系。
然而,许多列并不这么简单。列的状态可能已自定义,或使用了 Eloquent 访问器。在这种情况下,你可能需要自定义排序行为。
你可以传入表格中真实数据库列的数组,用于对该列进行排序:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('full_name')
->sortable(['first_name', 'last_name'])在此例中,full_name 不是数据库中的真实列,但 first_name 和 last_name 列是。当对 full_name 列排序时,Filament 会按 first_name 和 last_name 列对表格排序。传入两列的原因是:如果两条记录的 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);
})TIP
query 参数的函数可以将各种工具作为参数注入。
默认排序
如果未应用其他排序,你可以选择默认对表格排序。可以使用 defaultSort() 方法实现:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->defaultSort('stock', direction: 'desc');
}第二个参数是可选的,默认为 'asc'。
如果将表格列名作为第一个参数传入,Filament 会使用该列的排序行为(自定义排序列或查询函数)。不过,若需要按表格或数据库中不存在的列排序,则应改为传入查询函数:
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->defaultSort(function (Builder $query): Builder {
return $query->orderBy('stock');
});
}在用户会话中持久化排序
要在用户会话中持久化排序,请使用 persistSortInSession() 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->persistSortInSession();
}设置默认排序选项标签
要设置默认排序选项标签,请使用 defaultSortOptionLabel() 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->defaultSortOptionLabel('Date');
}禁用默认主键排序
默认情况下,Filament 会自动向表格查询添加主键排序,以确保记录顺序一致。主键将与其他排序列按相同方向排序。如果表格没有主键,或你希望禁用此行为,可以使用 defaultKeySort(false) 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->defaultKeySort(false);
}搜索
列可以通过表格右上角的文本输入字段进行搜索。要使列可搜索,必须使用 searchable() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->searchable()

默认情况下,Filament 会向 Eloquent 查询应用 where 子句,按列名搜索。这适用于列名与数据库列名匹配的简单情况。它也可以处理关联关系。
然而,许多列并不这么简单。列的状态可能已自定义,或使用了 Eloquent 访问器。在这种情况下,你可能需要自定义搜索行为。
你可以传入表格中真实数据库列的数组,用于对该列进行搜索:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('full_name')
->searchable(['first_name', 'last_name'])在此例中,full_name 不是数据库中的真实列,但 first_name 和 last_name 列是。当搜索 full_name 列时,Filament 会按 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}%")
->orWhere('last_name', 'like', "%{$search}%");
})TIP
query 参数的函数可以将各种工具作为参数注入。
向表格添加额外可搜索列
你可以通过向 searchable() 方法传入列名数组,让表格使用表格中不存在的额外列进行搜索:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->searchable(['id']);
}你可以使用点语法在关联关系中搜索:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->searchable(['id', 'author.id']);
}你也可以传入自定义函数用于搜索:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->searchable([
'id',
'author.id',
function (Builder $query, string $search): Builder {
if (! is_numeric($search)) {
return $query;
}
return $query->whereYear('published_at', $search);
},
]);
}自定义表格搜索字段占位符
你可以使用 $table 上的 searchPlaceholder() 方法自定义搜索字段中的占位符:
use Filament\Tables\Table;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->searchPlaceholder('Search (ID, Name)');
}单独搜索
你可以使用 isIndividual 参数选择为每列启用搜索输入字段:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->searchable(isIndividual: true)

如果使用 isIndividual 参数,你仍然可以使用整个表格的主「全局」搜索输入字段搜索该列。
若要禁用该功能同时仍保留单独搜索功能,需要使用 isGlobal 参数:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->searchable(isIndividual: true, isGlobal: false)自定义表格搜索防抖
你可以使用 $table 上的 searchDebounce() 方法自定义所有表格搜索字段的防抖时间。默认设置为 500ms:
use Filament\Tables\Table;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->searchDebounce('750ms');
}在输入框失焦时搜索
与其在用户输入搜索时自动重新加载表格内容(这受搜索字段防抖影响),你可以使用 searchOnBlur() 方法更改行为,使表格仅在用户使输入框失焦(按 Tab 或点击外部)时才搜索:
use Filament\Tables\Table;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->searchOnBlur();
}在用户会话中持久化搜索
要在用户会话中持久化表格或单独列搜索,请使用 persistSearchInSession() 或 persistColumnSearchInSession() 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->persistSearchInSession()
->persistColumnSearchesInSession();
}禁用搜索词拆分
默认情况下,表格搜索会将搜索词拆分为单独的单词,并分别搜索每个单词。这允许更灵活的搜索查询。不过,在涉及大型数据集时,这可能对性能产生负面影响。你可以使用表格上的 splitSearchTerms(false) 方法禁用此行为:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->splitSearchTerms(false);
}你也可以在列上使用 splitIndividualSearchTerms() 方法,覆盖该列单独搜索的表格设置:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->searchable(isIndividual: true)
->splitIndividualSearchTerms(false)INFO
此方法仅影响列的单独搜索。表格全局搜索的搜索词拆分由表格的 splitSearchTerms() 方法控制。
可点击的单元格内容
点击单元格时,可以打开 URL 或触发「操作」。
打开 URL
要打开 URL,可以使用 url() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->url(fn (Post $record): string => route('posts.edit', ['post' => $record]))TIP
url() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。
你也可以选择在新标签页中打开 URL:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->url(fn (Post $record): string => route('posts.edit', ['post' => $record]))
->openUrlInNewTab()DANGER
如果向 url() 方法传入用户控制的数据,应验证该 URL 未使用危险协议,例如 javascript: 或 data:。否则可能使应用面临 XSS 攻击。最简单的防护方式是用 Filament 的 Str::sanitizeUrl() 辅助函数包装该值,对于任何不使用 http/https(或相对路径)的 URL,它会返回 null。
触发操作
要在点击单元格时运行函数,可以使用 action() 方法。每个方法接受一个 $record 参数,你可以用它自定义操作的行为:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->action(function (Post $record): void {
$this->dispatch('open-post-edit-modal', post: $record->getKey());
})操作模态框
你可以通过向 action() 方法传入 Action 对象来打开操作模态框:
use Filament\Actions\Action;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->action(
Action::make('select')
->requiresConfirmation()
->action(function (Post $record): void {
$this->dispatch('select-post', post: $record->getKey());
}),
)传入 action() 方法的 Action 对象必须具有唯一名称,以便与表格中的其他操作区分。
阻止单元格被点击
你可以使用 disabledClick() 方法阻止单元格被点击:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->disabledClick()如果启用了行 URL,该单元格将不可点击。
为列添加工具提示
你可以指定在鼠标悬停在单元格上时显示的工具提示:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('title')
->tooltip('Title')TIP
除静态值外,tooltip() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。


为列添加表头工具提示
你可以指定在鼠标悬停在列表头上时显示的工具提示:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('sku')
->headerTooltip('Stock Keeping Unit')TIP
除静态值外,headerTooltip() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。


列内容对齐
水平对齐列内容
你可以使用 alignStart()、alignCenter() 或 alignEnd() 方法将列内容对齐到起始(在从左到右的界面中为左侧,在从右到左的界面中为右侧)、居中或末尾(在从左到右的界面中为右侧,在从右到左的界面中为左侧):
use Filament\Tables\Columns\TextColumn;
TextColumn::make('email')
->alignStart() // This is the default alignment.
TextColumn::make('email')
->alignCenter()
TextColumn::make('email')
->alignEnd()或者,你可以将 Alignment 枚举传给 alignment() 方法:
use Filament\Support\Enums\Alignment;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('email')
->label('Email address')
->alignment(Alignment::End)TIP
除静态值外,alignment() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。


垂直对齐列内容
你可以使用 verticallyAlignStart()、verticallyAlignCenter() 或 verticallyAlignEnd() 方法将列内容对齐到起始、居中或末尾:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->verticallyAlignStart()
TextColumn::make('name')
->verticallyAlignCenter() // This is the default alignment.
TextColumn::make('name')
->verticallyAlignEnd()或者,你可以将 VerticalAlignment 枚举传给 verticalAlignment() 方法:
use Filament\Support\Enums\VerticalAlignment;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->verticalAlignment(VerticalAlignment::Start)TIP
除静态值外,verticalAlignment() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。


允许列表头换行
默认情况下,列表头在需要更多空间时不会换行到多行。你可以使用 wrapHeader() 方法允许它们换行:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->wrapHeader()可选地,你可以传入布尔值以控制表头是否应换行:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->wrapHeader(FeatureFlag::active())TIP
wrapHeader() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。


控制列宽
默认情况下,列会占用所需的空间。你可以使用 grow() 方法让某些列比其他列占用更多空间:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->grow()或者,你可以为列定义宽度,该宽度通过 style 属性传递给表头单元格,因此可以使用任何有效的 CSS 值:
use Filament\Tables\Columns\IconColumn;
IconColumn::make('is_paid')
->label('Paid')
->boolean()
->width('1%')TIP
width() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。


分组列
你可以使用 ColumnGroup 对象将多列组合在同一个标题下:
use Filament\Tables\Columns\ColumnGroup;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('title'),
TextColumn::make('slug'),
ColumnGroup::make('Visibility', [
TextColumn::make('status'),
IconColumn::make('is_featured'),
]),
TextColumn::make('author.name'),
]);
}第一个参数是分组的标签,第二个是属于该分组的列对象数组。


use Filament\Support\Enums\Alignment;
use Filament\Tables\Columns\ColumnGroup;
ColumnGroup::make('Website visibility')
->columns([
// ...
])
->alignCenter()
->wrapHeader()隐藏列
你可以使用 hidden() 或 visible() 方法隐藏列:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('email')
->hidden()
TextColumn::make('email')
->visible()要有条件地隐藏列,可以向任一方法传入布尔值:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('role')
->hidden(FeatureFlag::active())
TextColumn::make('role')
->visible(FeatureFlag::active())允许用户管理列
切换列可见性
用户可以自行在表格中隐藏或显示列。要使列可切换显示,请使用 toggleable() 方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('email')
->toggleable()

默认隐藏可切换显示的列
默认情况下,可切换显示的列是可见的。要使它们改为隐藏:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('id')
->toggleable(isToggledHiddenByDefault: true)重新排列列
你可以使用 reorderableColumns() 方法允许在表格中重新排列列:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->reorderableColumns();
}

实时列管理器
默认情况下,列管理器的更改(切换和重新排列列)会被延迟,直到用户点击「应用」按钮才影响表格。要禁用此行为并使筛选器变为「实时」,请使用 deferColumnManager(false) 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->reorderableColumns()
->deferColumnManager(false);
}在模态框中显示列管理器
要在模态框而不是下拉菜单中渲染列管理器,可以使用 columnManagerLayout() 方法:
use Filament\Tables\Enums\ColumnManagerLayout;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->columnManagerLayout(ColumnManagerLayout::Modal);
}

你可以使用触发操作 API来自定义模态框,包括使用 slideOver()。
自定义列管理器触发操作
要自定义列管理器触发按钮,可以使用 columnManagerTriggerAction() 方法,传入返回操作的闭包。所有可用于自定义操作触发按钮的方法都可以使用:
use Filament\Actions\Action;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->columnManagerTriggerAction(
fn (Action $action) => $action
->button()
->label('Column Manager'),
);
}在页脚显示重置操作
默认情况下,重置操作出现在列管理器的页头。你可以使用 columnManagerResetActionPosition() 方法将其移到页脚,放在应用操作旁边:
use Filament\Tables\Enums\ColumnManagerResetActionPosition;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->columnManagerResetActionPosition(ColumnManagerResetActionPosition::Footer);
}禁用用户会话中的列持久化
默认情况下,Filament 通过将表格的列存储在用户会话中来持久化它们。要防止在用户会话中持久化列,请使用 persistColumnsInSession(false) 方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->persistColumnsInSession(false);
}更改列管理器中的显示列数
默认情况下,列管理器以单列显示其选项。你可以使用 columnManagerColumns() 方法将其增加到多列:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->columns([
// ...
])
->columnManagerColumns(2);
}

为列内容添加额外 HTML 属性
你可以通过 extraAttributes() 方法向列内容传入额外 HTML 属性,这些属性会合并到其外层 HTML 元素上。属性应以数组表示,其中键是属性名,值是属性值:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('slug')
->extraAttributes(['class' => 'slug-column'])TIP
除静态值外,extraAttributes() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。
默认情况下,多次调用 extraAttributes() 会覆盖先前的属性。若希望改为合并属性,可以向该方法传入 merge: true。
为单元格添加额外 HTML 属性
你也可以向包围列内容的表格单元格传入额外 HTML 属性:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('slug')
->extraCellAttributes(['class' => 'slug-cell'])TIP
除静态值外,extraCellAttributes() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。
默认情况下,多次调用 extraCellAttributes() 会覆盖先前的属性。若希望改为合并属性,可以向该方法传入 merge: true。
为表头单元格添加额外属性
你可以向包围列内容的表格表头单元格传入额外 HTML 属性:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('slug')
->extraHeaderAttributes(['class' => 'slug-header-cell'])TIP
除静态值外,extraHeaderAttributes() 方法也接受函数以动态计算该值。你可以将各种工具作为参数注入到函数中。
默认情况下,多次调用 extraHeaderAttributes() 会覆盖先前的属性。若希望改为合并属性,可以向该方法传入 merge: true。
列工具注入
用于配置列的绝大多数方法都接受函数作为参数,而不是硬编码值:
use App\Models\User;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('email')
->placeholder(fn (User $record): string => "No email for {$record->name}")
TextColumn::make('role')
->badge(fn (User $record): bool => $record->role === 'admin')
TextColumn::make('name')
->extraAttributes(fn (User $record): array => ['class' => "{$record->getKey()}-name-column"])仅此一项就解锁了许多自定义可能性。
该包还能够将这些函数内部可使用的许多工具作为参数注入。所有接受函数作为参数的自定义方法都可以注入工具。
这些注入的工具需要使用特定的参数名。否则,Filament 不知道要注入什么。
注入列的当前状态
若要访问列的当前值(状态),请定义 $state 参数:
function ($state) {
// ...
}注入当前 Eloquent 记录
你可以使用 $record 参数检索当前 Schema 的 Eloquent 记录:
use Illuminate\Database\Eloquent\Model;
function (?Model $record) {
// ...
}注入行循环
要访问当前表格行的行循环对象,请定义 $rowLoop 参数:
function (stdClass $rowLoop) {
// ...
}注入当前 Livewire 组件实例
若要访问当前 Livewire 组件实例,请定义 $livewire 参数:
use Livewire\Component;
function (Component $livewire) {
// ...
}注入当前列实例
若要访问当前组件实例,请定义 $component 参数:
use Filament\Tables\Columns\Column;
function (Column $component) {
// ...
}注入当前表格实例
若要访问当前表格实例,请定义 $table 参数:
use Filament\Tables\Table;
function (Table $table) {
// ...
}注入多个工具
参数通过反射动态注入,因此你可以按任意顺序组合多个参数:
use App\Models\User;
use Livewire\Component as Livewire;
function (Livewire $livewire, mixed $state, User $record) {
// ...
}从 Laravel 容器注入依赖
你可以像往常一样从 Laravel 容器注入任何内容,同时注入工具:
use App\Models\User;
use Illuminate\Http\Request;
function (Request $request, User $record) {
// ...
}全局设置
若要全局更改所有列的默认行为,可以在服务提供者的 boot() 方法中调用静态 configureUsing() 方法,并向其传入用于修改列的 Closure。例如,若要使所有 TextColumn 列均可 toggleable()(可切换显示),可以这样做:
use Filament\Tables\Columns\TextColumn;
TextColumn::configureUsing(function (TextColumn $column): void {
$column->toggleable();
});当然,你仍然可以在每列上单独覆盖此设置:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('name')
->toggleable(false)