Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Laravel sucht mehrere Wörter, die durch Leerzeichen getrennt sind

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.