Have you ever needed to show Filament table records in RANDOM order? A typical example would be to Shuffle songs, like in Spotify. Let's see how to do it.
Let's say, we have a Filament resource for a Song model where we show columns title
and artist
.
app/Filament/Resources/SongResource.php
public static function table(Table $table): Table{ return $table ->columns([ Tables\Columns\TextColumn::make('id') ->label('ID'), Tables\Columns\TextColumn::make('title'), Tables\Columns\TextColumn::make('artist'), ]) ->filters([ // ]) ->actions([ // ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), ]), ]);}
The getHeaderActions()
method in the list class adds header actions for the list page.
use Filament\Actions;use Filament\Tables\Contracts\HasTable;use Illuminate\Database\Eloquent\Builder; protected function getHeaderActions(): array{ return [ Actions\Action::make('Shuffle songs') ->icon('heroicon-o-arrow-path-rounded-square') ->action(function (HasTable $livewire) { $livewire->getTable()->modifyQueryUsing(fn (Builder $query) => $query->inRandomOrder()); }), ];}
So, for the action, we inject the list page and get a table from it. When we have the table, we can use methods from it. In this case, we modify the query to get records in a random order.
When the button is pressed, we can see that records are in random order, looking at the ID column.
A few of our Premium Examples: