Star rating range filter (min/max) in Filament Tables

2026-02-13 Filament v4

Want to filter “Reviews” by rating range (e.g. up to 2⭐, 3⭐+, or 2–4⭐)? Here’s a compact Filament table filter using two Select fields and a clean active-filter indicator.


Filter code (drop into ->filters([]))

Filter::make('rating')
->schema([
\Filament\Forms\Components\Select::make('min_rating')
->label('Minimum Rating')
->options([
1 => '1 ⭐',
2 => '2 ⭐',
3 => '3 ⭐',
4 => '4 ⭐',
5 => '5 ⭐',
])
->placeholder('Any'),
 
\Filament\Forms\Components\Select::make('max_rating')
->label('Maximum Rating')
->options([
1 => '1 ⭐',
2 => '2 ⭐',
3 => '3 ⭐',
4 => '4 ⭐',
5 => '5 ⭐',
])
->placeholder('Any'),
])
->query(function (Builder $query, array $data): Builder {
return $query
->when(
$data['min_rating'],
fn (Builder $query, $minRating): Builder => $query->where('rating', '>=', $minRating),
)
->when(
$data['max_rating'],
fn (Builder $query, $maxRating): Builder => $query->where('rating', '<=', $maxRating),
);
})
->indicateUsing(function (array $data): ?string {
if (! $data['min_rating'] && ! $data['max_rating']) {
return null;
}
 
if ($data['min_rating'] && $data['max_rating']) {
return "Rating: {$data['min_rating']}-{$data['max_rating']} ⭐";
}
 
if ($data['min_rating']) {
return "Rating: {$data['min_rating']}+ ⭐";
}
 
return "Rating: up to {$data['max_rating']} ⭐";
}),


What it does

  • schema() renders two selects inside the filter popover.
  • query() applies >= min and/or <= max only when selected.
  • indicateUsing() generates a readable chip like “Rating: 2-4 ⭐” or “Rating: 3+ ⭐”.

A few of our Premium Examples: