So machen Sie es mit Query\Builder
, aber zuerst einige zusätzliche Anmerkungen:
// 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 ...
Allerdings können Sie sich natürlich nicht auf explode
verlassen denn im obigen Fall würden Sie alle Zeilen erhalten.
Das sollten Sie also tun:
$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();
Es gibt einen Abschluss im where
weil es sich bewährt hat, or where
einzuschließen Klauseln in Klammern. Zum Beispiel, wenn Ihr User
verwendetes Modell SoftDeletingScope
und Sie würden nicht tun, was ich vorgeschlagen habe, Ihre ganze Abfrage wäre durcheinander geraten.