Laravel Nova : rechercher dans la DB (recherche globale et par ressource)
CRUD, filtres, métriques et actions : le back-office est déjà très complet. Il manque souvent la brique que vos clients utilisent en premier : la recherche.
Nova propose deux niveaux : une recherche globale (barre du haut, toutes les ressources configurées) et une recherche locale sur l’index d’une ressource (clients ou commandes uniquement, en respectant les filtres actifs). Tout se configure en quelques lignes via $search, title et subtitle sur chaque ressource.
Recherche Nova : deux champs, deux usages
Vous avez déjà deux ressources Customer et Order avec index, détail, création et édition (partie 3). Vous filtrez, vous consultez les stats (partie 4) et vous exécutez des actions en masse (partie 5).
Nova affiche deux champs de recherche :
| Emplacement | Portée | Filtres |
|---|---|---|
| Barre du haut | Recherche globale — toutes les ressources marquées comme cherchables | Non |
| Index d’une ressource | Recherche locale — uniquement cette ressource | Oui — les filtres actifs sont pris en compte |
Exemple : vous tapez « Jessica » dans la barre globale → le client Jessica remonte, et toutes les commandes liées si la relation est configurée dans $search. Sur l’index Customer seul, seuls les clients correspondants apparaissent.
Référence : Global Search — documentation Laravel Nova.
$search : quels champs sont cherchables ?
Sur chaque ressource Nova (app/Nova/Customer.php, app/Nova/Order.php), la propriété $search liste les colonnes (et relations) utilisées pour la recherche.
Customer : attribut simple
public static $search = [
'id',
'name',
'email',
'phone',
'company',
'status',
];
Retirez 'name' → une recherche sur « Jessie » ne trouve plus rien. Remettez-le → ça refonctionne après rechargement.
C’est aussi simple que ça : vous déclarez où Nova peut chercher, rien de plus.
Order : chercher dans les relations
Sur les commandes, on veut chercher par ID, statut, montant… et par le nom du client :
public static $search = [
'id',
'status',
'amount',
'customer.name',
];
Une recherche globale sur « Jessie » remonte alors le client et ses commandes — car Nova traverse la relation customer et filtre sur name.
title et subtitle : des résultats lisibles
Sans configuration, la recherche globale peut afficher des ID bruts peu parlants pour vos clients (ex. l’ID du customer sur une ligne commande).
Attribut title (clé simple)
Pour une ressource dont le libellé correspond à un champ unique :
public static $title = 'name';
C’est ce qui fait apparaître Jessica plutôt qu’un numéro dans les résultats clients.
Méthode title() (concaténation)
Pour les commandes, un simple champ ne suffit pas. Remplacez l’attribut par une méthode :
public function title()
{
return "Commande n°{$this->id} ({$this->amount} €)";
}
Résultat dans la recherche globale : Commande n°57 (149,00 €) au lieu d’un ID obscur.
Méthode subtitle() (ligne secondaire)
Même principe pour une deuxième ligne sous le titre :
public function subtitle()
{
return $this->customer?->name;
}
Recherche « Jess » → titre Commande n°57 (…) et en dessous Jessica. Interface claire, sans code custom côté front.
Ressource non cherchable
Par défaut, une ressource est cherchable dans la recherche globale. Si ce n’est pas pertinent (logs techniques, tables internes), désactivez-le :
public static $globallySearchable = false;
La recherche locale sur l’index reste disponible tant que $search est défini.
Attribut vs méthode pour $search
Sur Customer, un tableau en dur dans $search suffit souvent :
public static $search = ['id', 'name', 'email', ...];
Sur Order, une méthode qui retourne un tableau offre plus de flexibilité — notamment pour activer le full-text search sur MySQL ou PostgreSQL :
public static function searchableColumns()
{
return [
'id',
'status',
'amount',
'customer.name',
];
}
Selon la version Nova, la propriété s’appelle
$searchou s’expose viasearchableColumns(). Consultez la doc de votre version pour le nom exact ; le principe reste le même.
La documentation Nova détaille aussi :
- recherche full-text (plus performante que
LIKE %mot%sur gros volumes) ; - drivers base de données spécifiques ;
- relations polymorphiques ;
- champs JSON.
Pour un back-office classique clients / commandes, le tableau simple couvre 95 % des besoins — mais c’est utile de savoir que l’écosystème va plus loin.
Récap : recherche globale vs locale
Barre du haut (globale)
└── Parcourt chaque ressource avec $globallySearchable = true
└── Utilise $search + title() / subtitle() pour l’affichage
Index Customer ou Order (locale)
└── Cherche uniquement dans cette ressource
└── Respecte les filtres actifs (comme les actions en masse)
Vidéo : recherche en pratique
FAQ rapide (SEO & technique)
Où configurer la recherche Nova ?
Propriété $search (ou méthode équivalente) sur chaque ressource dans app/Nova/.
Quelle différence entre recherche globale et index ?
Globale = toutes les ressources cherchables ; index = une seule ressource + filtres actifs.
Comment chercher sur une relation ?
Ajoutez la notation pointée dans $search, ex. 'customer.name'.
Comment éviter d’afficher des ID dans les résultats ?
Définissez $title, ou une méthode title() / subtitle() sur la ressource.
Peut-on désactiver la recherche globale sur une ressource ?
Oui — $globallySearchable = false.
Conclusion
La recherche Nova complète le back-office : deux niveaux (globale / locale), champs déclarés dans $search, libellés soignés via title() et subtitle(), et support des relations sans requêtes manuelles.
Encore une fois, quelques lignes suffisent pour un outil que vos clients utiliseront tous les jours.
Suite de la série : Laravel Nova : sécurité et policies (accès CRUD).