Масові дії (bulk actions) виконуються над кількома вибраними рядками. Щойно в таблиці з'являється хоча б одна така дія, біля кожного рядка з'являється чекбокс.
У Filament 5 їх кладуть у toolbarActions() (або headerActions()), часто згрупованими у випадне меню:
use Filament\Actions\BulkAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Illuminate\Database\Eloquent\Collection;
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
BulkAction::make('publish')
->label('Опублікувати')
->requiresConfirmation()
->action(fn (Collection $records) => $records->each->update(['status' => 'published']))
->deselectRecordsAfterCompletion(),
]),
])
$records - Eloquent-колекція вибраних моделей.
Дії над окремим рядком - окремо, у recordActions():
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
Корисні налаштування:
->checkIfRecordIsSelectableUsing(fn (Order $record): bool => $record->status !== 'archived')- деякі рядки вибрати не можна;->maxSelectableRecords(100)- обмеження кількості;->selectCurrentPageOnly()- не давати одним кліком вибрати всі сторінки.
Пастки:
$records->each->update(...)- окремий запит на кожен запис. Для сотень рядків це прийнятно, для десятків тисяч - ні (єchunkSelectedRecords()іfetchSelectedRecords(false));- права:
DeleteBulkActionу ресурсі перевіряє політикуdeleteAny. Для власних дій перевірку прав треба додати самому, наприкладauthorizeIndividualRecords('update')- тоді записи, які користувач змінювати не може, просто не потраплять у$records; - після дії вибір рядків за замовчуванням лишається -
deselectRecordsAfterCompletion()прибирає його.