Mysql
 sql >> Base de données >  >> RDS >> Mysql

laravel recherche plusieurs mots séparés par un espace

Voici comment procéder avec Query\Builder , mais d'abord quelques remarques supplémentaires :

// user can provide double space by accident, or on purpose:
$string = 'john  doe';

// so with explode you get this:
explode(' ', $string);
array(
  0 => 'john',
  1 => '',
  2 => 'doe'
)

// Now if you go with LIKE '%'.value.'%', you get this:
select * from table where name like '%john%' or name like '%%' or ...

Cela dit, vous ne pouvez évidemment pas compter sur explode car dans le cas ci-dessus, vous obtiendrez toutes les lignes.

Voici donc ce que vous devez faire :

$string = 'john  doe';

// split on 1+ whitespace & ignore empty (eg. trailing space)
$searchValues = preg_split('/\s+/', $string, -1, PREG_SPLIT_NO_EMPTY); 

$users = User::where(function ($q) use ($searchValues) {
  foreach ($searchValues as $value) {
    $q->orWhere('name', 'like', "%{$value}%");
  }
})->get();

Il y a fermeture dans le where parce que c'est une bonne pratique d'envelopper votre or where clauses entre parenthèses. Par exemple, si votre User modèle utilisé SoftDeletingScope et vous ne feriez pas ce que j'ai suggéré, toute votre requête serait foirée.