1
votes

Laravel Eloquent Where Query avec plusieurs mots

J'ai la requête suivante (par souci de brièveté):

    $employees = Employee::where('first_name', 'LIKE', "%$query%")
                 ->orWhere('last_name', 'LIKE', "%$query%")

Maintenant, cela fonctionne lorsque l'utilisateur saisit un seul nom comme «John» ou «Smith», mais lorsqu'il saisit «John Smith 'il ne trouve rien. Est-ce que je manque un extra ou où?


0 commentaires

3 Réponses :


1
votes

Vous devrez ajouter un troisième ouWhere . Pour notre fonction de recherche, nous utilisons quelque chose comme ceci:

Employee::whereraw("COALESCE(last_name, '') LIKE '%$query%'")
    ->Orwhereraw("COALESCE(first_name, '') LIKE '%$query%'")
    ->Orwhereraw("COALESCE(last_name + ', ' + first_name, '') LIKE '%$query%'")

L'ajout de Coalesce a semblé aider à résoudre certains problèmes que nous avons rencontrés lors de sa première implémentation, mais je ne sais pas si cela est nécessaire dans votre cas.


0 commentaires

2
votes

Essayez ceci:

Employee::where(DB::raw('CONCAT(first_name," ",lastname)'), 'LIKE', "%' . $query . '%"))


2 commentaires

Merci! Ils fonctionnent tous mais celui-ci est le plus court!


Attention: la réponse est grande ouverte pour l'injection SQL. laravel.com/docs/5.7/queries#raw-expressions



1
votes

Vous pouvez faire:

$ fullName = trim ($ query);

$employees  = Employee::where(DB::raw("CONCAT(first_name, ' ', last_name)"), 'LIKE', "%".$fullName."%")->get();

Vous concaténez les valeurs de la base de données pour first_name + '' + last_name , puis en utilisant like pour trouver les enregistrements correspondants.


2 commentaires

Attention: la réponse est grande ouverte pour l'injection SQL. laravel.com/docs/5.7/queries#raw-expressions


@MuratTutumlu pas vraiment, le DB :: raw est utilisé dans la concaténation de colonnes où aucune variable définie n'est passée. et la chaîne de requête est passée dans l'argument where () qui est sans danger pour les injections.