Så här gör du med Query\Builder
, men först några ytterligare anmärkningar:
// 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 ...
Som sagt, du kan uppenbarligen inte lita på explode
eftersom du i ovanstående fall skulle få alla rader.
Så här är vad du bör göra:
$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();
Det finns stängning i where
eftersom det är en bra praxis att slå in din or where
satser inom parentes. Till exempel om din User
modell som används SoftDeletingScope
och du inte skulle göra vad jag föreslog, hela din fråga skulle bli rörd.