Підсумки (summaries) - рядок під таблицею з агрегатами по колонках. Їх додають до колонки методом summarize():
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\Summarizers\Average;
use Filament\Tables\Columns\Summarizers\Count;
use Filament\Tables\Columns\Summarizers\Range;
use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Query\Builder;
TextColumn::make('total')
->money('UAH')
->summarize([
Sum::make()->money('UAH')->label('Разом'),
Average::make()->money('UAH')->label('Середній чек'),
]),
TextColumn::make('created_at')
->date()
->summarize(Range::make()->minimalDateTimeDifference()),
IconColumn::make('is_paid')
->boolean()
->summarize(
Count::make()->query(fn (Builder $query) => $query->where('is_paid', true))->label('Оплачено'),
),
Чотири вбудовані підсумовувачі: Sum, Average, Count, Range (мінімум-максимум, зокрема для дат). Власний - через Summarizer::make()->using(...).
Як вони рахуються:
- окремим SQL-агрегатом по запиту таблиці з урахуванням пошуку й фільтрів;
- якщо сторінок кілька, показуються два рядки: підсумок поточної сторінки й підсумок по всіх записах;
query()звужує набір лише для цього підсумку (наприклад, рахувати тільки оплачені).
Підсумки по групах. Якщо рядки згруповані (defaultGroup('status')), підсумок з'являється під кожною групою. А groupsOnly() ховає самі рядки, лишаючи тільки групи з підсумками - вийде простий звіт прямо в адмінці.
Пастки:
- перша колонка таблиці не може мати підсумків - у ній виводиться підпис рядка підсумків;
- підсумки працюють по колонці в базі. Для колонки з аксесором чи
state()SQL-агрегат порахувати нема з чого; - кожен підсумок - окремий агрегатний запит на кожне оновлення таблиці. На великих таблицях без індексів під фільтри це відчутно;
- гроші краще зберігати в копійках цілим числом і показувати через
money(divideBy: 100), щоб сума не накопичувала похибку float.