Drag

Laravel Nova : filtres et métriques (stats du dashboard)

Laravel Nova : filtres et métriques (partie 4)

Écrit par : Thibault Chazottes

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-&gt;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.