--- title: Ternary filters --- ## Introduction Ternary filters allow you to easily create a select filter which has three states - usually true, false and blank. To filter a column named `is_admin` to be `true` or `false`, you may use the ternary filter: ```php use Filament\Tables\Filters\TernaryFilter; TernaryFilter::make('is_admin') ``` ## Using a ternary filter with a nullable column Another common pattern is to use a nullable column. For example, when filtering verified and unverified users using the `email_verified_at` column, unverified users have a null timestamp in this column. To apply that logic, you may use the `nullable()` method: ```php use Filament\Tables\Filters\TernaryFilter; TernaryFilter::make('email_verified_at') ->nullable() ``` ## Customizing the column used by a ternary filter The column name used to scope the query is the name of the filter. To customize this, you may use the `attribute()` method: ```php use Filament\Tables\Filters\TernaryFilter; TernaryFilter::make('verified') ->nullable() ->attribute('status_id') ``` ## Customizing the ternary filter option labels You may customize the labels used for each state of the ternary filter. The true option label can be customized using the `trueLabel()` method. The false option label can be customized using the `falseLabel()` method. The blank (default) option label can be customized using the `placeholder()` method: ```php use Illuminate\Database\Eloquent\Builder; use Filament\Tables\Filters\TernaryFilter; TernaryFilter::make('email_verified_at') ->label('Email verification') ->nullable() ->placeholder('All users') ->trueLabel('Verified users') ->falseLabel('Not verified users') ``` ## Customizing how a ternary filter modifies the query You may customize how the query changes for each state of the ternary filter, use the `queries()` method: ```php use Illuminate\Database\Eloquent\Builder; use Filament\Tables\Filters\TernaryFilter; TernaryFilter::make('email_verified_at') ->label('Email verification') ->placeholder('All users') ->trueLabel('Verified users') ->falseLabel('Not verified users') ->queries( true: fn (Builder $query) => $query->whereNotNull('email_verified_at'), false: fn (Builder $query) => $query->whereNull('email_verified_at'), blank: fn (Builder $query) => $query, // In this example, we do not want to filter the query when it is blank. ) ``` ## Filtering soft-deletable records The `TrashedFilter` can be used to filter soft-deleted records. It is a type of ternary filter that is built-in to Filament. You can use it like so: ```php use Filament\Tables\Filters\TrashedFilter; TrashedFilter::make() ```