Filtres
Les filtres ajoutent des contrôles à la barre de filtres de la liste, au-dessus de la recherche en texte libre. Ils se déclarent dans 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 de base Filter
Tout filtre implémente type() (comment le contrôle est affiché côté frontend) et apply(Builder $query, mixed $value): Builder (comment la valeur choisie se traduit en clause de la requête). La méthode label(string $label) est commune à tous.
Pour remplacer la logique de correspondance d'un filtre précis sans créer de nouvelle sous-classe :
SelectFilter::make('category')
->options([...])
->query(fn (Builder $query, mixed $value): Builder => $query->where('category', $value)->whereNotNull('published_at'))query() remplace entièrement apply() lorsqu'il est fourni.
Filtres inclus
SelectFilter
Filtre par égalité exacte sur une liste déroulante d'options.
SelectFilter::make('category')
->options(['news' => 'News', 'update' => 'Update', 'announcement' => 'Announcement'])En interne : $query->where($this->name, $value).
TernaryFilter
Trois états : oui / non / indifférent. Pensé pour les colonnes booléennes.
TernaryFilter::make('is_published')
->trueLabel('Published') // par défaut : "Yes"
->falseLabel('Draft') // par défaut : "No"
->placeholder('Any status') // par défaut : "Any"Il accepte '1'/'true'/true comme « oui » et '0'/'false'/false comme « non » ; toute autre valeur ne filtre rien.
DateRangeFilter
Une plage from/to sur une colonne de date.
DateRangeFilter::make('published_at')
->label('Published between')
->displayFormat('d/m/Y')La valeur attendue est un tableau ['from' => ..., 'to' => ...] ; chacune des deux clés est facultative, et chacune se traduit en un whereDate('>=', …) ou whereDate('<=', …) indépendant.
RelationFilter
Filtre la liste par un enregistrement lié, choisi depuis un combobox avec recherche, le même composant que le champ Relation, mais en tant que filtre.
RelationFilter::make('author_id')
->related(User::class)
->titleAttribute('name')
->optionsQuery(fn (Builder $query): Builder => $query->whereNotNull('email_verified_at'))| Méthode | Description |
|---|---|
related(class-string<Model> $model) | Le modèle lié. |
titleAttribute(string $attribute) | Attribut affiché dans chaque option. name par défaut. |
searchColumns(string ...$columns) | Colonnes sur lesquelles le combobox cherche. |
optionsQuery(Closure $callback) | Restreint les enregistrements qui apparaissent dans le sélecteur. |
placeholder(string $text) | Texte quand rien n'est sélectionné. Any par défaut. |
optionsQuery() et non query() délibérément : le Filter de base a déjà un query(Closure) hérité qui remplace la façon dont le filtre fait correspondre les enregistrements (voir « La classe de base Filter » plus haut) ; réutiliser ce nom pour « quelles options sont proposées » entrerait en collision silencieusement. RelationFilter sert son propre endpoint d'options, séparé de celui d'un champ Relation, précisément parce qu'un filtre et un champ peuvent partager le même nom (filtrer par la même colonne que celle qu'un champ du formulaire choisit déjà).
Cette première version n'admet qu'une seule valeur, il n'y a pas encore de variante ->multiple().