J'ai un formulaire avec 1 entrée pour filtrer par le nom complet (!) :
$users = User::where('firstname', 'like', '%'.$keyword.'%')->get();
Problème : le nom complet est divisé en 3 champs dans mes bases de données table utilisateur :
# users id | title | firstname | lastname --------------------------------- 1 | Dr. | John | Doe 2 | | Peter | Pan
fullname = title + firstname + lastname
Je voudrais trouver des résultats pour des entrées comme Dr. Doe , mais aussi John Doe ou juste Peter.
Actuellement, je ne sais filtrer chaque champ séparément:
<label>Search by fullname:</label> <input type="text" name="fullname">
Une idée? Merci!
3 Réponses :
Vous pouvez utiliser DB :: raw () et MySQL's concat pour y parvenir:
$users = User::where(DB::raw('concat(title," ",firstname," ",lastname)'), 'like', '%'.$keyword.'%')->get();
Presque! :-) Cela ne fonctionnera pas pour Dr. Doe
(titre + nom).
@ Mr.B. Toutes mes excuses, j'avais utilisé nom
dans ma réponse au lieu de nom
. J'ai mis à jour ma réponse :)
La création d'un index de texte intégral des champs title
, firstname
et lastname
dans la table user
est un approche plus correcte pour aller.
Vous pouvez effectuer une requête DB :: raw
en utilisant la syntaxe MATCH (... columns) AGAINST expr
. 1
Le coût de cette approche est que l'index est mis à jour lors des écritures. Cependant, cela vous donne une recherche robuste sans que vous ayez à vous soucier de l'ordre de l'un des champs de la requête de recherche.
Comme la réponse de Davit, ce n'est pas la meilleure solution , mais cela fonctionnera probablement.
$fullName = "Mr Philip Phil Philips"; $nameParts = explode(' ', $fullName); $matching_users = User::whereIn('first_name', $nameParts) ->orWhereIn('last_name', $nameParts) ->orWhereIn('title', $nameparts) ->get();
si le nom complet contient tous les autres champs, il vous suffit de rechercher le nom complet
Mais
fullname
n'existe pas dans la table.OK, j'ai compris....