Групування показує рядки блоками зі спільним заголовком: замовлення за статусом, задачі за проєктом, події за днем.
Групування за замовчуванням:
$table->defaultGroup('status');
Вибір групування користувачем:
use Filament\Tables\Grouping\Group;
$table
->groups([
'status',
Group::make('author.name')
->label('Автор')
->collapsible(),
Group::make('created_at')
->label('День')
->date(),
])
->defaultGroup('status');
- за зв'язком - крапкова нотація (
author.name); - за датою -
date()групує по дню й ігнорує час, інакше кожна мітка часу стала б окремою групою; collapsible()- групи можна згортати.
Заголовок і опис групи:
Group::make('status')
->getTitleFromRecordUsing(fn (Order $record): string => $record->status->getLabel())
->titlePrefixedWithLabel(false)
Для enum з HasLabel заголовок береться з підпису автоматично.
Як це працює. Filament сортує запит за полем групи і розбиває поточну сторінку на блоки. Тобто групування - це сортування плюс заголовки, а не GROUP BY. Звідси наслідки:
- група може «розірватися» між сторінками пагінації: частина замовлень зі статусом «нове» на одній сторінці, частина на наступній;
- групування за зв'язком сортує через приєднання таблиці зв'язку - на великих обсягах варто мати індекси;
- власне сортування користувача діє всередині групи.
Поєднання з підсумками. Підсумовувачі колонок (summarize()) показують агрегат під кожною групою, а groupsOnly() ховає рядки й лишає тільки заголовки груп з підсумками - готовий звіт «скільки й на яку суму в кожному статусі».
Масовий вибір у групі: selectGroupsOnly() дозволяє масово вибирати рядки лише в межах однієї групи - корисно, коли масова дія має сенс тільки для однорідних записів.