汇总
简介
你可以在表格内容下方渲染一个“汇总”区间。这非常适合于在表格中显示诸如数据平均值、总和、计数和范围之类的计算结果。
默认情况下,当前数据页会显示一行汇总,如果有多个可用页面,则会显示一行用于显示所有数据总计的附加汇总。你还可以为记录组添加汇总,请参阅“行分组汇总”。
可以使用 summarize() 方法将 “Summarizer” 对象添加到任何表格列中:
use Filament\Tables\Columns\Summarizers\Average;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('rating')
->summarize(Average::make())
同一个列可以添加多个汇总:
use Filament\Tables\Columns\Summarizers\Average;
use Filament\Tables\Columns\Summarizers\Range;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('rating')
->numeric()
->summarize([
Average::make(),
Range::make(),
])
表格中的第一列不能使用汇总器。该列用于渲染汇总区域的标题和副标题。

可用汇总器
Filament 自带四类汇总器:
你也可以创建自定义汇总器,用你希望的方式展示数据。
平均值
平均值用来计算数据 集中所有值的平均值:
use Filament\Tables\Columns\Summarizers\Average;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('rating')
->summarize(Average::make())
上例中,表格中的所有评分(rating)都会将被加在一起,然后除以评分个数。
计数
Count 可用于查找数据集中值的总数。除非你只想计算行数,否则你可能还需要确定数据集的范围:
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\Summarizers\Count;
use Illuminate\Database\Query\Builder;
IconColumn::make('is_published')
->boolean()
->summarize(
Count::make()->query(fn (Builder $query) => $query->where('is_published', true)),
),
上例中,表格会计算发布了多少篇文章。
计算图标的出现次数
在图标列中使用计数器允许你使用 icons() 方法,为用户提供表格中每个图标数量的直观表示:
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\Summarizers\Count;
use Illuminate\Database\Query\Builder;
IconColumn::make('is_published')
->boolean()
->summarize(Count::make()->icons()),
范围
范围可用于计算数据集中的最小值和最大值:
use Filament\Tables\Columns\Summarizers\Range;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('price')
->summarize(Range::make())
本例中,将会寻找表格中的最低价格和最高价格。
日期范围
你可以使用 minimalDateTimeDifference() 方法将范围格式化为日期:
use Filament\Tables\Columns\Summarizers\Range;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('created_at')
->dateTime()
->summarize(Range::make()->minimalDateTimeDifference())
此方法将显示最小日期和最大日期之间的最小差异。例如:
- 如果最小日期和最大日期不同,则仅显示日期。
- 如果最小日期和最大日期在同一天的不同时间,则将同时显示日期和时间。
- 如果最小日期和最大日期及时间相同,则仅显示一次。
文本范围
你可以使用 minimalTextualDifference() 方法将范围格式化为文本:
use Filament\Tables\Columns\Summarizers\Range;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('sku')
->summarize(Range::make()->minimalTextualDifference())
此方法将显示最小值和最大值之间的最小差异。例如:
- 如果最小值和最大值的首字母不同,则仅显示首字母。
- 如果最小值和最大值的首字母相同,则将渲染更多文本,直到找到差异。
- 如果最小值和最大值相同,则它们仅显示一次。
在范围中包含 null 值
默认情况下,我们会从范围中排除空值(null)。如果你想包含它们,可以使用 excludeNull(false) 方法:
use Filament\Tables\Columns\Summarizers\Range;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('sku')
->summarize(Range::make()->excludeNull(false))
总和
总和(Sum)用于计算数据集中所有数据的总和:
use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('price')
->summarize(Sum::make())
上例中,表格里所有的价 格将会加到一起。
设置标签
使用 label() 方法,你可以设置汇总器的标签:
use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('price')
->summarize(Sum::make()->label('Total'))
设置数据集查询范围
使用 query() 方法,你可以限制汇总器数据集的数据库查询范围:
use Filament\Tables\Columns\Summarizers\Average;
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Query\Builder;
TextColumn::make('rating')
->summarize(
Average::make()->query(fn (Builder $query) => $query->where('is_published', true)),
),
上例中,只有 is_published 设置为 true 的记录会被用于计算平均值。
该功能在使用计数汇总器时尤其有用,它可以计算数据集中有多少记录通过测试:
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\Summarizers\Count;
use Illuminate\Database\Query\Builder;
IconColumn::make('is_published')
->boolean()
->summarize(
Count::make()->query(fn (Builder $query) => $query->where('is_published', true)),
),
