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():
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:
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.
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.
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.
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.
RelationFilter::make('author_id')
->related(User::class)
->titleAttribute('name')
->optionsQuery(fn (Builder $query): Builder => $query->whereNotNull('email_verified_at'))| Mètode | Descripció |
|---|---|
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().