Skip to content

Filtres ​

Els filtres afegeixen controls a la barra de filtres del llistat, per sobre de la cerca de text lliure. Es declaren dins de filters():

php
public function filters(): array
{
    return [
        TernaryFilter::make('is_published')
            ->label('Status')
            ->trueLabel('Published')
            ->falseLabel('Draft'),

        SelectFilter::make('category')
            ->options(['news' => 'News', 'update' => 'Update', 'announcement' => 'Announcement']),

        DateRangeFilter::make('published_at')
            ->label('Published between'),
    ];
}

La classe base Filter ​

Tot filtre implementa type() (com es renderitza el control al frontend) i apply(Builder $query, mixed $value): Builder (com es tradueix el valor triat en una clàusula de la query). El mètode label(string $label) és comú a tots.

Per sobreescriure la lògica de matching d'un filtre concret sense crear-ne una subclasse nova:

php
SelectFilter::make('category')
    ->options([...])
    ->query(fn (Builder $query, mixed $value): Builder => $query->where('category', $value)->whereNotNull('published_at'))

query() substitueix apply() per complet quan es proporciona.

Filtres inclosos ​

SelectFilter ​

Filtra per igualtat exacta sobre un desplegable d'opcions.

php
SelectFilter::make('category')
    ->options(['news' => 'News', 'update' => 'Update', 'announcement' => 'Announcement'])

Internament: $query->where($this->name, $value).

TernaryFilter ​

Tres estats: sí / no / qualsevol. Pensat per a columnes booleanes.

php
TernaryFilter::make('is_published')
    ->trueLabel('Published')   // per defecte: "Yes"
    ->falseLabel('Draft')      // per defecte: "No"
    ->placeholder('Any status') // per defecte: "Any"

Accepta '1'/'true'/true com a «sí» i '0'/'false'/false com a «no»; qualsevol altre valor no filtra res.

DateRangeFilter ​

Un rang from/to sobre una columna de data.

php
DateRangeFilter::make('published_at')
    ->label('Published between')
    ->displayFormat('d/m/Y')

El valor esperat és un array ['from' => ..., 'to' => ...]; qualsevol de les dues claus és opcional, i cadascuna es tradueix en un whereDate('>=', …) o whereDate('<=', …) independent.

RelationFilter ​

Filtra el llistat per un registre relacionat, triat des d'un combobox cercable, el mateix component que el camp Relation, però com a filtre.

php
RelationFilter::make('author_id')
    ->related(User::class)
    ->titleAttribute('name')
    ->optionsQuery(fn (Builder $query): Builder => $query->whereNotNull('email_verified_at'))
MètodeDescripció
related(class-string<Model> $model)El model relacionat.
titleAttribute(string $attribute)Atribut mostrat a cada opció. name per defecte.
searchColumns(string ...$columns)Columnes contra les quals cerca el combobox.
optionsQuery(Closure $callback)Restringeix quins registres apareixen al picker.
placeholder(string $text)Text quan no hi ha res seleccionat. Any per defecte.

optionsQuery() i no query() deliberadament: el Filter base ja té un query(Closure) heretat que sobreescriu com el filtre encaixa els registres (vegeu «La classe base Filter» més amunt); reutilitzar aquest nom per a «quines opcions s'ofereixen» hi col·lidiria en silenci. RelationFilter serveix el seu propi endpoint d'opcions, separat del d'un camp Relation, precisament perquè un filtre i un camp poden compartir el mateix nom (filtrar per la mateixa columna que ja tria un camp del formulari).

Aquesta primera versió només admet un sol valor, encara no hi ha una variant ->multiple().