Mysql
 sql >> Baza danych >  >> RDS >> Mysql

laravel wyszukuje wiele słów oddzielonych spacją

W ten sposób robisz to za pomocą Query\Builder , ale najpierw kilka dodatkowych uwag:

// 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 ...

To powiedziawszy, oczywiście nie możesz polegać na explode ponieważ w powyższym przypadku otrzymasz wszystkie wiersze.

Oto, co powinieneś zrobić:

$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();

Jest zamknięcie w where ponieważ dobrą praktyką jest zawijanie or where klauzule w nawiasach. Na przykład, jeśli Twój User używany model SoftDeletingScope a ty nie zrobiłbyś tego, co sugerowałem, całe twoje zapytanie byłoby pomieszane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę używać przezroczystego szyfrowania danych w MySQL?

  2. doktryna2 - Jak poprawić efektywność spłukiwania?

  3. Różnica w wymaganym czasie na wstawienie rekordów InnoDB/MyISAM

  4. Jak dodać ograniczenie sprawdzające w migracji Railsów?

  5. MySQL:różnica dwóch zestawów wyników