列类位于 Filament\Tables\Columns 命名空间中。它们放在 $table->colu…">
Skip to content
全部文档

概述

简介

列类位于 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)访问关联关系中的属性:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')

TextColumn::make('author.name')

列内容(状态)

列起初可能感觉有些神奇,但它们被设计为简单易用,并针对显示 Eloquent 记录中的数据进行了优化。尽管如此,它们很灵活,你可以从任何来源显示数据,而不仅仅是 Eloquent 记录属性。

列显示的数据称为其「状态」(state)。使用面板资源时,表格知道它正在显示的记录。这意味着列的状态根据记录上该属性的值设置。例如,如果该列用于 PostResource 的表格中,则会显示当前帖子的 title 属性值。

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')

若要访问存储在关联关系中的值,可以使用「点语法」。你想访问数据的关联关系名称在前,后跟一个点,然后是属性名:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('author.name')

你也可以使用「点语法」访问 Eloquent 模型上 JSON / 数组列中的值。属性名在前,后跟一个点,然后是你想读取的 JSON 对象的键:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('meta.title')

设置列的状态

你可以使用 state() 方法向列传入自己的状态:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->state('Hello, world!')

TIP

state() 方法也接受函数以动态计算状态。你可以将各种工具作为参数注入到函数中。

设置列的默认状态

当列为空(其状态为 null)时,你可以使用 default() 方法定义要改用的替代状态。此方法会将默认状态视为真实状态,因此像图片颜色这样的列会显示默认图片或颜色。

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->default('Untitled')

列为空时添加占位文本

有时你可能想为状态为空的列显示占位文本,其样式为较浅的灰色文字。这与默认值不同,因为占位符始终是文本,不会被当作真实状态处理。

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->placeholder('Untitled')
为空状态显示占位符的列为空状态显示占位符的列

显示关联关系中的数据

你可以使用「点语法」访问关联关系中的列。关联关系名称在前,后跟一个点,然后是要显示的列名:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('author.name')

统计关联数量

若要在列中统计关联记录的数量,可以使用 counts() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('users_count')->counts('users')

在此示例中,users 是要统计的关联关系名称。列名必须是 users_count,因为这是 Laravel 用于存储结果的约定

若要在统计前对关联关系进行限定,可以向该方法传入一个数组,其中键是关联关系名称,值是用于限定 Eloquent 查询的函数:

php
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() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('users_exists')->exists('users')

在此示例中,users 是要检查是否存在的关联关系名称。列名必须是 users_exists,因为这是 Laravel 用于存储结果的约定

若要在检查存在性前对关联关系进行限定,可以向该方法传入一个数组,其中键是关联关系名称,值是用于限定 Eloquent 查询的函数:

php
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() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('users_avg_age')->avg('users', 'age')

在此示例中,users 是关联关系名称,age 是被求平均的字段。列名必须是 users_avg_age,因为这是 Laravel 用于存储结果的约定

若要在聚合前对关联关系进行限定,可以向该方法传入一个数组,其中键是关联关系名称,值是用于限定 Eloquent 查询的函数:

php
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() 方法自定义:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->label('Full name')

TIP

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

以这种方式自定义标签,在你希望使用本地化翻译字符串时很有用:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->label(__('columns.name'))

排序

列可以通过点击列标签进行排序。要使列可排序,必须使用 sortable() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->sortable()
带可排序列的表格带可排序列的表格

Filament 会使用列名向 Eloquent 查询应用 orderBy() 子句。这适用于列名与数据库列名匹配的简单情况。它也可以处理关联关系

然而,许多列并不这么简单。列的状态可能已自定义,或使用了 Eloquent 访问器。在这种情况下,你可能需要自定义排序行为。

你可以传入表格中真实数据库列的数组,用于对该列进行排序:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('full_name')
    ->sortable(['first_name', 'last_name'])

在此例中,full_name 不是数据库中的真实列,但 first_namelast_name 列是。当对 full_name 列排序时,Filament 会按 first_namelast_name 列对表格排序。传入两列的原因是:如果两条记录的 first_name 相同,将使用 last_name 对它们排序。如果用例不需要这样,也可以只在数组中传入一列。

你也可以直接与 Eloquent 查询交互,以自定义该列的排序应用方式:

php
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() 方法实现:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->defaultSort('stock', direction: 'desc');
}

第二个参数是可选的,默认为 'asc'

如果将表格列名作为第一个参数传入,Filament 会使用该列的排序行为(自定义排序列或查询函数)。不过,若需要按表格或数据库中不存在的列排序,则应改为传入查询函数:

php
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() 方法:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->persistSortInSession();
}

设置默认排序选项标签

要设置默认排序选项标签,请使用 defaultSortOptionLabel() 方法:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->defaultSortOptionLabel('Date');
}

禁用默认主键排序

默认情况下,Filament 会自动向表格查询添加主键排序,以确保记录顺序一致。主键将与其他排序列按相同方向排序。如果表格没有主键,或你希望禁用此行为,可以使用 defaultKeySort(false) 方法:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->defaultKeySort(false);
}

搜索

列可以通过表格右上角的文本输入字段进行搜索。要使列可搜索,必须使用 searchable() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->searchable()
带可搜索列的表格带可搜索列的表格

默认情况下,Filament 会向 Eloquent 查询应用 where 子句,按列名搜索。这适用于列名与数据库列名匹配的简单情况。它也可以处理关联关系

然而,许多列并不这么简单。列的状态可能已自定义,或使用了 Eloquent 访问器。在这种情况下,你可能需要自定义搜索行为。

你可以传入表格中真实数据库列的数组,用于对该列进行搜索:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('full_name')
    ->searchable(['first_name', 'last_name'])

在此例中,full_name 不是数据库中的真实列,但 first_namelast_name 列是。当搜索 full_name 列时,Filament 会按 first_namelast_name 列搜索表格。

你也可以直接与 Eloquent 查询交互,以自定义该列的搜索应用方式:

php
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() 方法传入列名数组,让表格使用表格中不存在的额外列进行搜索:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->searchable(['id']);
}

你可以使用点语法在关联关系中搜索:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->searchable(['id', 'author.id']);
}

你也可以传入自定义函数用于搜索:

php
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() 方法自定义搜索字段中的占位符:

php
use Filament\Tables\Table;

public static function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->searchPlaceholder('Search (ID, Name)');
}

单独搜索

你可以使用 isIndividual 参数选择为每列启用搜索输入字段:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->searchable(isIndividual: true)
带单独可搜索列的表格带单独可搜索列的表格

如果使用 isIndividual 参数,你仍然可以使用整个表格的主「全局」搜索输入字段搜索该列。

若要禁用该功能同时仍保留单独搜索功能,需要使用 isGlobal 参数:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->searchable(isIndividual: true, isGlobal: false)

自定义表格搜索防抖

你可以使用 $table 上的 searchDebounce() 方法自定义所有表格搜索字段的防抖时间。默认设置为 500ms

php
use Filament\Tables\Table;

public static function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->searchDebounce('750ms');
}

在输入框失焦时搜索

与其在用户输入搜索时自动重新加载表格内容(这受搜索字段防抖影响),你可以使用 searchOnBlur() 方法更改行为,使表格仅在用户使输入框失焦(按 Tab 或点击外部)时才搜索:

php
use Filament\Tables\Table;

public static function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->searchOnBlur();
}

在用户会话中持久化搜索

要在用户会话中持久化表格或单独列搜索,请使用 persistSearchInSession()persistColumnSearchInSession() 方法:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->persistSearchInSession()
        ->persistColumnSearchesInSession();
}

禁用搜索词拆分

默认情况下,表格搜索会将搜索词拆分为单独的单词,并分别搜索每个单词。这允许更灵活的搜索查询。不过,在涉及大型数据集时,这可能对性能产生负面影响。你可以使用表格上的 splitSearchTerms(false) 方法禁用此行为:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->splitSearchTerms(false);
}

你也可以在列上使用 splitIndividualSearchTerms() 方法,覆盖该列单独搜索的表格设置:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->searchable(isIndividual: true)
    ->splitIndividualSearchTerms(false)

INFO

此方法仅影响列的单独搜索。表格全局搜索的搜索词拆分由表格的 splitSearchTerms() 方法控制。

可点击的单元格内容

点击单元格时,可以打开 URL 或触发「操作」。

打开 URL

要打开 URL,可以使用 url() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->url(fn (Post $record): string => route('posts.edit', ['post' => $record]))

TIP

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

TIP

你也可以为整行选择要打开的 URL,而不仅仅是单个列。请参阅记录 URL 部分

同时使用记录 URL 和列 URL 时,列 URL 将仅对这些单元格覆盖记录 URL。

你也可以选择在新标签页中打开 URL:

php
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 参数,你可以用它自定义操作的行为:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->action(function (Post $record): void {
        $this->dispatch('open-post-edit-modal', post: $record->getKey());
    })

操作模态框

你可以通过向 action() 方法传入 Action 对象来打开操作模态框

php
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() 方法阻止单元格被点击:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->disabledClick()

如果启用了行 URL,该单元格将不可点击。

为列添加工具提示

你可以指定在鼠标悬停在单元格上时显示的工具提示:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('title')
    ->tooltip('Title')

TIP

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

触发工具提示的列触发工具提示的列

为列添加表头工具提示

你可以指定在鼠标悬停在列表头上时显示的工具提示:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('sku')
    ->headerTooltip('Stock Keeping Unit')

TIP

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

带列表头工具提示的表格带列表头工具提示的表格

列内容对齐

水平对齐列内容

你可以使用 alignStart()alignCenter()alignEnd() 方法将列内容对齐到起始(在从左到右的界面中为左侧,在从右到左的界面中为右侧)、居中或末尾(在从左到右的界面中为右侧,在从右到左的界面中为左侧):

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('email')
    ->alignStart() // This is the default alignment.

TextColumn::make('email')
    ->alignCenter()

TextColumn::make('email')
    ->alignEnd()

或者,你可以将 Alignment 枚举传给 alignment() 方法:

php
use Filament\Support\Enums\Alignment;
use Filament\Tables\Columns\TextColumn;

TextColumn::make('email')
    ->label('Email address')
    ->alignment(Alignment::End)

TIP

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

对齐到末尾的列对齐到末尾的列

垂直对齐列内容

你可以使用 verticallyAlignStart()verticallyAlignCenter()verticallyAlignEnd() 方法将列内容对齐到起始、居中或末尾:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->verticallyAlignStart()

TextColumn::make('name')
    ->verticallyAlignCenter() // This is the default alignment.

TextColumn::make('name')
    ->verticallyAlignEnd()

或者,你可以将 VerticalAlignment 枚举传给 verticalAlignment() 方法:

php
use Filament\Support\Enums\VerticalAlignment;
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->verticalAlignment(VerticalAlignment::Start)

TIP

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

垂直对齐到起始的列垂直对齐到起始的列

允许列表头换行

默认情况下,列表头在需要更多空间时不会换行到多行。你可以使用 wrapHeader() 方法允许它们换行:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->wrapHeader()

可选地,你可以传入布尔值以控制表头是否应换行:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->wrapHeader(FeatureFlag::active())

TIP

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

带换行列表头的表格带换行列表头的表格

控制列宽

默认情况下,列会占用所需的空间。你可以使用 grow() 方法让某些列比其他列占用更多空间:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->grow()

或者,你可以为列定义宽度,该宽度通过 style 属性传递给表头单元格,因此可以使用任何有效的 CSS 值:

php
use Filament\Tables\Columns\IconColumn;

IconColumn::make('is_paid')
    ->label('Paid')
    ->boolean()
    ->width('1%')

TIP

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

带列宽控制的表格带列宽控制的表格

分组列

你可以使用 ColumnGroup 对象将多列组合在同一个标题下:

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

第一个参数是分组的标签,第二个是属于该分组的列对象数组。

带分组列的表格带分组列的表格

你也可以在 ColumnGroup 对象上控制分组表头的对齐换行。为提升 API 的多行流畅性,你可以将 columns() 链式调用到对象上,而不是作为第二个参数传入:

php
use Filament\Support\Enums\Alignment;
use Filament\Tables\Columns\ColumnGroup;

ColumnGroup::make('Website visibility')
    ->columns([
        // ...
    ])
    ->alignCenter()
    ->wrapHeader()

隐藏列

你可以使用 hidden()visible() 方法隐藏列:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('email')
    ->hidden()

TextColumn::make('email')
    ->visible()

要有条件地隐藏列,可以向任一方法传入布尔值:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('role')
    ->hidden(FeatureFlag::active())

TextColumn::make('role')
    ->visible(FeatureFlag::active())

允许用户管理列

切换列可见性

用户可以自行在表格中隐藏或显示列。要使列可切换显示,请使用 toggleable() 方法:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('email')
    ->toggleable()
带列管理器的表格带列管理器的表格
默认隐藏可切换显示的列

默认情况下,可切换显示的列是可见的。要使它们改为隐藏:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('id')
    ->toggleable(isToggledHiddenByDefault: true)

重新排列列

你可以使用 reorderableColumns() 方法允许在表格中重新排列列:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->reorderableColumns();
}
带可重排列管理器的表格带可重排列管理器的表格

实时列管理器

默认情况下,列管理器的更改(切换和重新排列列)会被延迟,直到用户点击「应用」按钮才影响表格。要禁用此行为并使筛选器变为「实时」,请使用 deferColumnManager(false) 方法:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->reorderableColumns()
        ->deferColumnManager(false);
}

在模态框中显示列管理器

要在模态框而不是下拉菜单中渲染列管理器,可以使用 columnManagerLayout() 方法:

php
use Filament\Tables\Enums\ColumnManagerLayout;
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->columnManagerLayout(ColumnManagerLayout::Modal);
}
在模态框中显示列管理器的表格在模态框中显示列管理器的表格

自定义列管理器触发操作

要自定义列管理器触发按钮,可以使用 columnManagerTriggerAction() 方法,传入返回操作的闭包。所有可用于自定义操作触发按钮的方法都可以使用:

php
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() 方法将其移到页脚,放在应用操作旁边:

php
use Filament\Tables\Enums\ColumnManagerResetActionPosition;
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->columnManagerResetActionPosition(ColumnManagerResetActionPosition::Footer);
}

禁用用户会话中的列持久化

默认情况下,Filament 通过将表格的列存储在用户会话中来持久化它们。要防止在用户会话中持久化列,请使用 persistColumnsInSession(false) 方法:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->persistColumnsInSession(false);
}

更改列管理器中的显示列数

默认情况下,列管理器以单列显示其选项。你可以使用 columnManagerColumns() 方法将其增加到多列:

php
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->columnManagerColumns(2);
}
带双列列管理器的表格带双列列管理器的表格

为列内容添加额外 HTML 属性

你可以通过 extraAttributes() 方法向列内容传入额外 HTML 属性,这些属性会合并到其外层 HTML 元素上。属性应以数组表示,其中键是属性名,值是属性值:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('slug')
    ->extraAttributes(['class' => 'slug-column'])

TIP

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

默认情况下,多次调用 extraAttributes() 会覆盖先前的属性。若希望改为合并属性,可以向该方法传入 merge: true

为单元格添加额外 HTML 属性

你也可以向包围列内容的表格单元格传入额外 HTML 属性:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('slug')
    ->extraCellAttributes(['class' => 'slug-cell'])

TIP

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

默认情况下,多次调用 extraCellAttributes() 会覆盖先前的属性。若希望改为合并属性,可以向该方法传入 merge: true

为表头单元格添加额外属性

你可以向包围列内容的表格表头单元格传入额外 HTML 属性:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('slug')
    ->extraHeaderAttributes(['class' => 'slug-header-cell'])

TIP

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

默认情况下,多次调用 extraHeaderAttributes() 会覆盖先前的属性。若希望改为合并属性,可以向该方法传入 merge: true

列工具注入

用于配置列的绝大多数方法都接受函数作为参数,而不是硬编码值:

php
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 参数:

php
function ($state) {
    // ...
}

注入当前 Eloquent 记录

你可以使用 $record 参数检索当前 Schema 的 Eloquent 记录:

php
use Illuminate\Database\Eloquent\Model;

function (?Model $record) {
    // ...
}

注入行循环

要访问当前表格行的行循环对象,请定义 $rowLoop 参数:

php
function (stdClass $rowLoop) {
    // ...
}

注入当前 Livewire 组件实例

若要访问当前 Livewire 组件实例,请定义 $livewire 参数:

php
use Livewire\Component;

function (Component $livewire) {
    // ...
}

注入当前列实例

若要访问当前组件实例,请定义 $component 参数:

php
use Filament\Tables\Columns\Column;

function (Column $component) {
    // ...
}

注入当前表格实例

若要访问当前表格实例,请定义 $table 参数:

php
use Filament\Tables\Table;

function (Table $table) {
    // ...
}

注入多个工具

参数通过反射动态注入,因此你可以按任意顺序组合多个参数:

php
use App\Models\User;
use Livewire\Component as Livewire;

function (Livewire $livewire, mixed $state, User $record) {
    // ...
}

从 Laravel 容器注入依赖

你可以像往常一样从 Laravel 容器注入任何内容,同时注入工具:

php
use App\Models\User;
use Illuminate\Http\Request;

function (Request $request, User $record) {
    // ...
}

全局设置

若要全局更改所有列的默认行为,可以在服务提供者的 boot() 方法中调用静态 configureUsing() 方法,并向其传入用于修改列的 Closure。例如,若要使所有 TextColumn 列均可 toggleable()(可切换显示),可以这样做:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::configureUsing(function (TextColumn $column): void {
    $column->toggleable();
});

当然,你仍然可以在每列上单独覆盖此设置:

php
use Filament\Tables\Columns\TextColumn;

TextColumn::make('name')
    ->toggleable(false)