Saltar al contenido principal

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:

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().