Constructor de consultas
Introducción
El constructor de consultas te permite definir un conjunto complejo de condiciones para filtrar los datos en tu tabla. Es capaz de manejar anidamiento ilimitado de condiciones, que puedes agrupar con operaciones "and" y "or".
Para usarlo, necesitas definir un conjunto de "restricciones" que se usarán para filtrar los datos. Filament incluye algunas restricciones prediseñadas, que siguen tipos de datos comunes, pero también puedes definir tus propias restricciones personalizadas.
Puedes añadir un constructor de consultas a cualquier tabla usando el filtro QueryBuilder
:
use Filament\Tables\Filters\QueryBuilder;
use Filament\Tables\Filters\QueryBuilder\Constraints\BooleanConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\DateConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\NumberConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\RelationshipConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\RelationshipConstraint\Operators\IsRelatedToOperator;
use Filament\Tables\Filters\QueryBuilder\Constraints\SelectConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\TextConstraint;
QueryBuilder::make()
->constraints([
TextConstraint::make('name'),
BooleanConstraint::make('is_visible'),
NumberConstraint::make('stock'),
SelectConstraint::make('status')
->options([
'draft' => 'Borrador',
'reviewing' => 'Revisando',
'published' => 'Publicado',
])
->multiple(),
DateConstraint::make('created_at'),
RelationshipConstraint::make('categories')
->multiple()
->selectable(
IsRelatedToOperator::make()
->titleAttribute('name')
->searchable()
->multiple(),
),
NumberConstraint::make('reviewsRating')
->relationship('reviews', 'rating')
->integer(),
])
Cuando anides profundamente el constructor de consultas, puede que necesites aumentar la cantidad de espacio que los filtros pueden consumir. Una forma de hacer esto es colocando los filtros encima del contenido de la tabla:
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\QueryBuilder;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->filters([
QueryBuilder::make()
->constraints([
// ...
]),
], layout: FiltersLayout::AboveContent);
}
Restricciones disponibles
Filament incluye muchas restricciones diferentes que puedes usar inmediatamente. También puedes crear tus propias restricciones personalizadas:
- Restricción de texto
- Restricción booleana
- Restricción numérica
- Restricción de fecha
- Restricción select
- Restricción de relaciones
Restricciones de texto
Permiten filtrar campos de texto. Se pueden usar para filtrar cualquier campo de texto, incluso a través de relaciones.
use Filament\Tables\Filters\QueryBuilder\Constraints\TextConstraint;
TextConstraint::make('name') // Filtra la columna `name`
TextConstraint::make('creatorName')
->relationship(name: 'creator', titleAttribute: 'name') // Filtra la columna `name` en la relación `creator`
Operadores disponibles:
- Contiene
- No contiene
- Empieza con
- No empieza con
- Termina con
- No termina con
- Es igual
- No es igual
- Está lleno
- Está vacío
Restricciones booleanas
Permiten filtrar campos booleanos.
use Filament\Tables\Filters\QueryBuilder\Constraints\BooleanConstraint;
BooleanConstraint::make('is_visible') // Filtra la columna `is_visible`
BooleanConstraint::make('creatorIsAdmin')
->relationship(name: 'creator', titleAttribute: 'is_admin')
Operadores disponibles:
- Es verdadero
- Es falso
Restricciones numéricas
Permiten filtrar campos numéricos.
use Filament\Tables\Filters\QueryBuilder\Constraints\NumberConstraint;
NumberConstraint::make('stock') // Filtra la columna `stock`
NumberConstraint::make('ordersItemCount')
->relationship(name: 'orders', titleAttribute: 'item_count')
Operadores disponibles:
- Es mínimo
- Es menor que
- Es máximo
- Es mayor que
- Es igual
- No es igual
- Está lleno
- Está vacío
Enteros
Por defecto, las restricciones numéricas permiten decimales. Para restringir a enteros, usa integer()
:
NumberConstraint::make('stock')
->integer()
Restricciones de fecha
Permiten filtrar campos de fecha.
use Filament\Tables\Filters\QueryBuilder\Constraints\DateConstraint;
DateConstraint::make('created_at')
DateConstraint::make('creatorCreatedAt')
->relationship(name: 'creator', titleAttribute: 'created_at')
Operadores disponibles incluyen: "Es después", "No es después", "Es antes", "No es antes", "Es fecha", "No es fecha", "Es mes", "No es mes", "Es año", "No es año".
Restricciones select
Permiten filtrar campos usando un campo select.
use Filament\Tables\Filters\QueryBuilder\Constraints\SelectConstraint;
SelectConstraint::make('status')
->options([
'draft' => 'Borrador',
'reviewing' => 'Revisando',
'published' => 'Publicado',
])
- Se puede hacer
searchable()
. - Se puede hacer
multiple()
para selección múltiple.
Restricciones de relaciones
Permiten filtrar campos usando datos de relaciones.
use Filament\Tables\Filters\QueryBuilder\Constraints\RelationshipConstraint;
use Filament\Tables\Filters\QueryBuilder\Constraints\RelationshipConstraint\Operators\IsRelatedToOperator;
RelationshipConstraint::make('creator')
->selectable(
IsRelatedToOperator::make()
->titleAttribute('name')
->searchable()
->multiple(),
)
Relaciones múltiples
Puedes usar multiple()
para relaciones como HasMany
.
Relaciones vacías
Puedes usar emptyable()
para incluir/excluir relaciones vacías.
Restricciones nullable
Puedes usar nullable()
para mostrar opciones de filtrar valores nulos.
Alcance de relaciones
Puedes usar modifyQueryUsing
en la relación para aplicar un alcance.
TextConstraint::make('adminCreatorName')
->relationship(
name: 'creator',
titleAttribute: 'name',
modifyQueryUsing: fn (Builder $query) => $query->where('is_admin', true),
)
Personalizar el ícono de la restricción
Puedes usar icon('heroicon-m-user')
.
Sobrescribir operadores por defecto
Puedes usar operators()
, pushOperators()
o unshiftOperators()
.
Crear restricciones personalizadas
Crea restricciones "inline" usando Constraint::make()
. Les puedes definir icon()
, label()
y operators()
.
Crear operadores personalizados
Puedes usar Operator::make()
con label()
, summary()
, y baseQuery()
o query()
.
Personalizar el selector de restricciones
- Puedes cambiar el número de columnas con
constraintPickerColumns()
. - Puedes personalizar el ancho máximo usando
constraintPickerWidth()
.