Zo doe je het met Query\Builder
, maar eerst wat aanvullende opmerkingen:
// 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 ...
Dat gezegd hebbende, je kunt natuurlijk niet vertrouwen op explode
omdat je in het bovenstaande geval alle rijen zou krijgen.
Dit is dus wat u moet doen:
$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();
Er is een afsluiting in de where
omdat het een goede gewoonte is om uw or where
clausules tussen haakjes. Bijvoorbeeld als uw User
gebruikt model SoftDeletingScope
en je zou niet doen wat ik voorstelde, je hele vraag zou in de war raken.