1
votes

Laravel / Eloquent: Comment utiliser WHERE LIKE pour les champs combinés?

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 commentaires

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....


3 Réponses :


2
votes

Vous pouvez utiliser DB :: raw () et MySQL's concat pour y parvenir:

$users = User::where(DB::raw('concat(title," ",firstname," ",lastname)'), 'like', '%'.$keyword.'%')->get();


2 commentaires

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 :)



1
votes

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.


0 commentaires

1
votes

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();


0 commentaires