跳到主要内容
版本:3.0

行分组

概述

使用共同的属性,你可以允许用户将表格行分组到一起。这对于以更有组织的方式显示大量数据非常有用。

可以使用要分组的属性名称(例如 status)或允许您自定义该分组行为的 Group 对象(例如 Group::make('status')->collapsable())来设置分组。

默认行分组

您可能希望始终使用指定属性对文章进行分组。要执行此操作,请将该分组传递给 defaultGroup() 方法:

use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->defaultGroup('status');
}
Table with grouping

允许用户选择分组

将分组名以数组的方式传入到 groups() 方法,你可以允许用户在不同分组之间进行选择:

use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
'status',
'category',
]);
}

你可以同时使用 groups()defaultGroup(), 让用户在不同分组中选择的同时,有一个默认分组设置:

use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
'status',
'category',
])
->defaultGroup('status');
}

通过关联属性分组

使用点语法,你也可以通过关联属性进行分组。比如,author 关联中有一个 name 属性,你可以使用 author.name 作为属性名称:

use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
'author.name',
]);
}

设置分组标签

默认情况下,分组标签会基于属性名生成。你可以在 Group 对象中使用 label() 方法,对其进行自定义:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('author.name')
->label('Author name'),
]);
}

设置分组标题

默认情况下,分组的标题是属性值。你可以在 Group 对象的 getTitleFromRecordUsing() 方法中返回一个新标题,来对其进行自定义:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->getTitleFromRecordUsing(fn (Post $record): string => ucfirst($record->status->getLabel())),
]);
}

禁用标题标签前缀

默认情况下,标题使用分组标签作为前缀。要禁用该前缀,请使用 titlePrefixedWithLabel(false) 方法:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->titlePrefixedWithLabel(false),
]);
}

设置分组描述

你也可以为分组设置描述,它会展示在分组标题下面。为此,请在 Group 对象中使用 getDescriptionFromRecordUsing() 方法:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->getDescriptionFromRecordUsing(fn (Post $record): string => $record->status->getDescription()),
]);
}

设置分组键

默认情况下,分组的键是该属性的值。它在内部用作该分组的行标识符,而不是标题。使用 Group 对象的 getKeyFromRecordUsing() 方法,使之返回新的键,你可以对其进行自定义:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->getKeyFromRecordUsing(fn (Post $record): string => $record->status->value),
]);
}

日期分组

使用日期时间列作为分组时,你可能只想使用日期分组,而忽略时间。为此,请在 Group 对象中使用 date() 方法:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('created_at')
->date(),
]);
}
Table with group descriptions

可折叠分组

您可以允许分组的行折叠在其分组标题下。要启用此功能,请在 Group 对象中使用 collapsable() 方法:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('author.name')
->collapsible(),
]);
}

分组汇总

你可以对分组进行汇总,以在分组内展示记录的汇总。如果您选择将汇总表添加到分组表中的列中,则此操作会自动生效。

隐藏分组行并且只显示汇总

使用 groupsOnly() 方法,你可以在分组内隐藏行,并且只显示每个分组的汇总。这对于许多报告场景很有用。

use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('views_count')
->summarize(Sum::make()),
TextColumn::make('likes_count')
->summarize(Sum::make()),
])
->defaultGroup('category')
->groupsOnly();
}

自定义 Eloquent 查询排序行为

有些特性要求表格能够按照分组对 Eloquent 查询进行排序。在 Group 对象上使用 orderQueryUsing() 方法,你可以对此进行自定义:

use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->orderQueryUsing(fn (Builder $query, string $direction) => $query->orderBy('status', $direction)),
]);
}

自定义 Eloquent 查询范围行为

有些特性要求表格能够按照分组对 Eloquent 查询范围进行设置。在 Group 对象上使用 scopeQueryUsing() 方法,你可以对此进行自定义:

use Filament\Tables\Grouping\Group;
use Illuminate\Database\Eloquent\Builder;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->scopeQueryUsing(fn (Builder $query, Post $record) => $query->where('status', $record->status)),
]);
}

自定义 Eloquent 查询分组行为

有些特性要求表格能够按照分组对 Eloquent 查询范围进行分组。在 Group 对象上使用 groupQueryUsing() 方法,你可以对此进行自定义:

use Filament\Tables\Grouping\Group;
use Illuminate\Database\Eloquent\Builder;

public function table(Table $table): Table
{
return $table
->groups([
Group::make('status')
->groupQueryUsing(fn (Builder $query) => $query->groupBy('status')),
]);
}

自定义分组下拉触发 Action

要自定义分组下拉触发按钮,你可以使用 groupRecordsTriggerAction() 方法,并传入一个返回 Action 的闭包。自定义 Action 触发按钮的所有方法都可以在此使用:

use Filament\Tables\Actions\Action;
use Filament\Tables\Table;

public function table(Table $table): Table
{
return $table
->groups([
// ...
])
->groupRecordsTriggerAction(
fn (Action $action) => $action
->button()
->label('Group records'),
);
}

在桌面端启用分组下拉功能

默认情况下,分组下拉按钮只会在移动端显示。在桌面设备中,分组下拉列表在表格的头部、使用 groupsInDropdownOnDesktop() 方法,你也可以启用桌面端的下拉菜单:

use Filament\Tables\Table;

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