sql >> Database teknologi >  >> RDS >> Mysql

laravel søg flere ord adskilt af mellemrum

Sådan gør du med Query\Builder , men først nogle yderligere bemærkninger:

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

Når det er sagt, kan du åbenbart ikke stole på explode fordi du i ovenstående tilfælde ville få alle rækkerne.

Så dette er hvad du skal gøre:

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

Der er lukning i where fordi det er en god praksis at pakke din or where klausuler i parentes. For eksempel hvis din User brugt model SoftDeletingScope og du ikke ville gøre, hvad jeg foreslog, ville hele din forespørgsel være rodet.



  1. Opret forbindelse til en mysql-database via SSH gennem PHP

  2. Hvorfor denne dvale-skabelon bulkUpdate ikke virker

  3. Hvordan kan jeg klone en SQL Server-database på den samme server i SQL Server 2008 Express?

  4. Liste over alle indekser i en SQLite-database