sql >> Databasteknik >  >> RDS >> Mysql

laravel sök flera ord separerade med mellanslag

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.



  1. SQL-kommandot INSERT fungerar men data visas inte i tabellen

  2. Hur kör jag PHP som är lagrad i en MySQL-databas?

  3. Ingen mer data att läsa från uttaget

  4. Tablix:Upprepa rubrikrader på varje sida som inte fungerar - Report Builder 3.0