filament/query-builder
Adds a query builder component for Filament, letting users compose filters and conditions through a clean UI. Useful for building advanced search and reporting screens without writing complex query logic by hand.
Installation
composer require filament/query-builder
Publish the config file (if needed):
php artisan vendor:publish --provider="Filament\QueryBuilder\QueryBuilderServiceProvider"
Basic Usage
Add the QueryBuilder widget to a Filament resource:
use Filament\Forms\Components\QueryBuilder;
public static function form(Form $form): Form
{
return $form
->schema([
QueryBuilder::make('users')
->label('Search Users')
->columns(3),
]);
}
First Use Case
Select or MultiSelect with QueryBuilder for dynamic, multi-criteria filtering.QueryBuilder::make('posts')
->label('Filter Posts')
->columns(2)
->query(fn (Builder $query) => $query->where('published', true))
Dynamic Query Building
Use modifyQueryUsing() to inject logic:
QueryBuilder::make('orders')
->modifyQueryUsing(fn (Builder $query) => $query->where('status', '!=', 'cancelled'))
Customizing Columns Override default column behavior:
QueryBuilder::make('products')
->columns(4)
->column('price', fn (Column $column) => $column->numeric())
Integration with Filament Tables
Use QueryBuilder in a Table for real-time filtering:
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->filters([
QueryBuilder::make('users')
->label('Advanced Search')
->columns(2),
]);
}
Reusing Query Builders Create a reusable trait or class:
class UserQueryBuilder extends QueryBuilder
{
public static function make(): static
{
return parent::make('users')
->label('User Search')
->columns(3)
->searchable(['name', 'email']);
}
}
Async or API Usage
For API endpoints, use QueryBuilder with Filament\Forms\Components\Hidden to store filters:
QueryBuilder::make('tasks')
->hidden()
->dehydrateStateUsing(fn (array $state) => json_encode($state))
Performance with Large Datasets
->limit(100) or ->with(['relationship']) sparingly. Consider caching or indexing.Relationship Pitfalls
->relationships():
QueryBuilder::make('posts')
->relationship('author', 'authors')
State Persistence
->persistState() or store in session manually.CSRF/Validation Conflicts
QueryBuilder fields may trigger validation errors.QueryBuilder::make('users')
->hidden()
->rules([])
QueryBuilder::make('orders')
->modifyQueryUsing(fn (Builder $query) => $query->toSql())
config/filament-query-builder.php for overrides (e.g., default columns).Custom Columns
Extend Filament\QueryBuilder\Columns\Column for new column types:
class RangeColumn extends Column
{
protected string $view = 'filament-query-builder::columns.range';
}
Override Views Publish and modify views:
php artisan vendor:publish --tag="filament-query-builder-views"
Hooks
Use registered and registeredColumn events for dynamic modifications:
QueryBuilder::make('tasks')
->registerUsing(fn (QueryBuilder $component) => $component->modifyQueryUsing(...))
How can I help you explore Laravel packages today?