Агрегации
Агрегации позволяют отображать итоговые значения (сумму, среднее, количество и др.) в подвале таблицы. Значения вычисляются на уровне базы данных с учётом текущих фильтров и поиска.

Создание
php artisan frame:summarizer TotalAmount --type=sum
Команда создаст класс в app/Frame/Summarizers/. Параметр --type определяет тип агрегации: sum, avg, count, min, max.
Использование
Чтобы добавить агрегацию к полю, используйте метод summarize():
public function fieldsForIndex(): array
{
return [
Text::make('name'),
Number::make('amount')
->summarize(Sum::make()->label('Total')),
];
}
Можно добавить несколько агрегаций к одному полю:
Number::make('amount')
->summarize([
Sum::make()->label('Total'),
Average::make()->label('Average'),
]),
Встроенные агрегации
Breakdown
Агрегация Breakdown визуализирует распределение значений колонки в виде компактной горизонтальной полосы. Подходит для Select, Toggle и других полей с конечным набором вариантов.
Select::make('audience')
->options(AudienceEnum::class)
->summarize(
Breakdown::make()
->label('Audience')
->nullLabel('Not set')
->colors([
'Junior' => '#3b82f6',
'Adult' => '#10b981',
'__null' => '#a1a1aa',
]),
),
__null для записей без значения. Если цвета не указаны — используется палитра по умолчанию.__().N/A.Кастомная агрегация
Для нестандартных вычислений создайте собственный класс:
<?php
namespace App\Frame\Summarizers;
use Frame\Laravel\Strategies\Summarizers\Summarizer;
use Illuminate\Contracts\Database\Query\Builder;
class AverageAge extends Summarizer
{
public function type(): string
{
return 'average';
}
public function apply(Builder $query, string $column): float|null
{
$result = (clone $query)
->whereNotNull($column)
->selectRaw("AVG(EXTRACT(YEAR FROM AGE({$column}))) as aggregate")
->value('aggregate');
return $result !== null ? round((float) $result, 1) : null;
}
}
DateTime::make('birthday')
->format('d.m.Y')
->summarize(
AverageAge::make()->label('Avg age'),
),
apply() получает чистый Query Builder без select и orderBy — можно безопасно вызывать агрегатные функции. Используйте clone $query, если добавляете where-условия.Постраничные итоги
По умолчанию агрегации вычисляются в двух режимах: для текущей страницы («Эта страница») и для всех записей («Все записи»). Если постраничные итоги не нужны — строка «Эта страница» не отображается.
Чтобы исключить агрегацию из постраничных итогов, используйте excludeFromPageSummary():
Number::make('amount')
->summarize(
Sum::make()
->label('Total')
->excludeFromPageSummary(),
),
Методы
__() автоматически.