Laravel Nova : filtres et métriques (stats du dashboard)
Après avoir créé un CRUD en 5 minutes sur les ressources Customer et Order, on enrichit l’interface : filtres cumulables et métriques (cards) sur le dashboard.
Clients avec ou sans commandes, commandes par statut ou par montant, sommes et graphiques… tout se déclare dans deux méthodes de la ressource : filters() et cards(). La plupart des champs sont même filtrables par défaut avec ->filterable().
Filtres et métriques : aller plus loin que le CRUD
Dans l’épisode précédent, deux ressources Nova (Customer, Order) généraient index, détail, création et édition. Il manquait encore deux briques essentielles d’un back-office professionnel :
- des filtres pour affiner les listes ;
- des métriques (cards) pour visualiser des stats sur le dashboard.
Sur les clients : filtre « avec commandes » / « sans commandes », cards de synthèse.
Sur les commandes : filtre par statut, filtre par montant (< 100 €, 100–1000 €, > 1000 €), sommes et graphiques.
Tout cela se configure très rapidement — sans routes, sans Ajax custom, sans gérer la cumulation des filtres à la main.
Références : Filters et Metrics.
Architecture : trois méthodes sur la ressource
Chaque ressource Nova (app/Nova/Customer.php, app/Nova/Order.php) expose :
| Méthode | Rôle |
|---|---|
fields() |
Champs du CRUD (vu partie 3) |
filters() |
Filtres disponibles sur l’index |
cards() |
Métriques affichées sur le dashboard de la ressource |
public function filters(NovaRequest $request): array
{
return [
new CustomerHasOrders,
new OrderByStatus,
];
}
public function cards(NovaRequest $request): array
{
return [
new TotalCustomers::make(),
new NewCustomers::make(),
];
}
Créer un filtre custom
Générer la classe
php artisan nova:filter CustomerHasOrders
Nova crée app/Nova/Filters/CustomerHasOrders.php avec deux méthodes :
options() — les choix affichés
Retourne les paires clé => label proposées dans le menu filtre :
public function options(NovaRequest $request): array
{
return [
'with' => 'Avec commandes',
'without' => 'Sans commandes',
];
}
apply() — la requête Eloquent
Reçoit la query en cours (déjà filtrée par d’autres filtres actifs) et la valeur choisie :
public function apply(NovaRequest $request, $query, $value)
{
if ($value === 'with') {
return $query->whereHas('orders');
}
if ($value === 'without') {
return $query->whereDoesntHave('orders');
}
return $query;
}
Puis brancher le filtre dans filters() de la ressource Customer.
Filtre par statut sur Order
Même principe avec php artisan nova:filter OrderByStatus :
public function options(NovaRequest $request): array
{
// Ex. depuis un enum ou une constante métier
return OrderStatus::labels();
}
public function apply(NovaRequest $request, $query, $value)
{
return $query->where('status', $value);
}
Filtres cumulables
Nova gère nativement la cumulation : plusieurs filtres actifs en même temps + la recherche globale. Si vous codiez chaque filtre à la main, il faudrait orchestrer routes, requêtes, état Ajax et compatibilité entre filtres — du travail répétitif pour rien.
Avec Nova, tout est pré-câblé.
filterable() : filtrer sans créer de classe
Pour les champs typiques (date, nombre, select…), inutile de recréer un filtre.
Ajoutez un champ et activez le filtrage natif :
DateTime::make('Date', 'created_at')
->sortable()
->filterable(),
sortable()→ flèches de tri sur la colonne ;filterable()→ menu de filtre par plage de dates (du… au…) automatiquement.
filterable() existe sur tous les fields Nova par défaut. Ajoutez le champ created_at, rechargez — le filtre date apparaît sans ligne de code supplémentaire côté filtre.
Métriques (cards) : les types natifs
Nova propose plusieurs metrics prêtes à l’emploi :
Value
Une valeur agrégée (total, moyenne, count) — ex. nombre total de clients.
Trend (Value over time)
Évolution sur une période (30 jours, etc.) — graphique jour par jour.
Partition
Répartition par catégorie — ex. commandes par statut (camembert / barres).
Progress
Barre de progression vers un objectif.
Autres cards
Nova permet aussi d’afficher des liens rapides ou des blocs d’information sur le dashboard — pratique pour des raccourcis métier.
Les métriques se déclarent dans cards() de la ressource ou du dashboard principal. Des metrics custom sont possibles si les natives ne suffisent pas — on le verra dans un prochain épisode.
Exemple métier : filtres sur les commandes
| Filtre | Implémentation |
|---|---|
| Par statut | Classe OrderByStatus + where('status', $value) |
| Montant < 100 € | Filtre custom where('total', '<', 100) |
| 100 € – 1000 € | whereBetween('total', [100, 1000]) |
| > 1000 € | where('total', '>', 1000) |
Chaque filtre = une petite classe dans app/Nova/Filters/, branchée dans Order::filters().
Pourquoi c’est « magique »
Recoder vous-même :
- l’UI des filtres ;
- l’Ajax et la persistance d’état ;
- la cumulation filtre + filtre + recherche ;
- les graphiques du dashboard ;
… représente des heures de développement boilerplate.
Nova livre tout ça out of the box : vous vous concentrez sur la logique métier dans apply() et le choix des metrics.
Vidéo : filtres et métriques en pratique
FAQ rapide (SEO & technique)
Où déclarer les filtres ?
Méthode filters() sur la ressource Nova + classes dans app/Nova/Filters/.
Comment créer un filtre ?
php artisan nova:filter NomDuFiltre — puis options() et apply().
Les filtres se cumulent-ils ?
Oui, Nova combine plusieurs filtres actifs et la recherche globale.
Faut-il un filtre custom pour une date ?
Non : DateTime::make(...)->filterable() suffit dans la plupart des cas.
Où afficher les stats ?
Méthode cards() — metrics Value, Trend, Partition, Progress.
Conclusion
Filtres et métriques complètent le CRUD Nova sans effort disproportionné : quelques classes pour les cas métier, filterable() pour le reste, cards natives pour le dashboard.
Prochain épisode : les actions — sélectionner des enregistrements et déclencher export CSV, PDF, envoi d’email, etc.