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.