表格构造器
行分组
概述
使用共同的属性,你可以允许用户将表格行分组到一起。这对于以更有组织的方式显示大量数据非常有用。
可以使用要分组的属性名称(例如 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();}
仅隐藏分组方向设置
使用 groupingDirectionSettingHidden()
方法,你可以隐藏分组方向选择界面:
use Filament\Tables\Table; public function table(Table $table): Table{ return $table ->defaultGroup('status') ->groupingDirectionSettingHidden();}
Edit on GitHubStill need help? Join our Discord community or open a GitHub discussion