行分组
概述
使用共同的属性,你可以允许用户将表格行分组到一起。这对于以更有组织的方式显示大量数据非常有用。
可以使用要分组的属性名称(例如 status
)或允许你自定义该分组行为的 Group
对象(例如 Group::make('status')->collapsable()
)来设置分组。
默认行分组
你可能希望始终使用指定属性对文章进行分组。要执行此操作,请将该分组传递给 defaultGroup()
方法:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->defaultGroup('status');
}
允许用户选择分组
将分组名以数组的方式传入到 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(),
]);
}
可折叠分组
你可以允许分组的行折叠在其分组标题下。要启用此功能,请在 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'),
);
}
在桌面端启用分组设置下拉功能
默认情况下,分组设置的下拉按钮只会在移动端显示。在桌面设备中,分组下拉列表在表格的头部,使用 groupingSettingsInDropdownOnDesktop()
方法,你也可以启用桌面端的下拉菜单:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->groups([
// ...
])
->groupingSettingsInDropdownOnDesktop();
}
隐藏分组设置
使用 groupingSettingsHidden()
方法,你可以隐藏分组设置界面:
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->defaultGroup('status');
->groupingSettingsHidden();
}