sql >> Database >  >> RDS >> Mysql

laravel zoek meerdere woorden gescheiden door spatie

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.



  1. RDBMS en NoSQL overbruggen:inleiding tot 2DX UI-cluster

  2. Meerdere rijen samenvoegen tot één rij en meerdere kolommen op mysql

  3. Ondersteunt transacties, vergrendeling op rijniveau en externe sleutels

  4. MySQL, beter om NULL of lege string in te voegen?