Używanie Eloquent ORM w Laravel do przeszukiwania bazy danych za pomocą LIKE

93

Chcę użyć aktywnego budowania rekordów Eloquent do zbudowania zapytania wyszukiwania, ale będzie to wyszukiwanie LIKE. Znalazłem User::find($term)lub User::find(1), ale to nie jest generowanie podobnej instrukcji. Nie szukam bezpośredniej odpowiedzi, ale jeśli ktoś mógłby mi przynajmniej wskazać kierunek, w którym mam zajrzeć, byłoby świetnie!

Jonathan
źródło
2
laravel.com/docs/database/eloquent .. możesz skorzystać z dokumentacji - jest to bardzo przejrzyste.
ytsejam
2
Widziałem tę stronę. Po prostu nie widziałem nic o wyszukiwaniu za pomocą symboli wieloznacznych. Nie chciałem też ustawiać wyrażenia regularnego w pętli foreach, ponieważ istnieją setki tysięcy wierszy
Jonathan
$ email = DB :: table ('users') -> where ('id', '=', 1) -> only ('email');
ytsejam
w dokumentacji nazywa się to narzędziem do tworzenia płynnych zapytań.
ytsejam
Gdybym mógł oznaczyć odpowiedź i twój komentarz jako odpowiedź, zrobiłbym to. Dziękuję za skierowanie mnie we właściwym kierunku
Jonathan

Odpowiedzi:

234

Jesteś w stanie znaleźć bazy danych używając LIKE z następującą składnią:

Model::where('column', 'LIKE', '%value%')->get();
Joel Larson
źródło
1
nie tak wydajne, zgłasza "Błąd krytyczny: osiągnięto maksymalny poziom zagnieżdżenia funkcji '100', przerywanie! in ..."
Sasi varna kumar
@gsk Myślę, że dołączasz (używając metody with ()), a następnie możesz normalnie przeszukiwać kolumnę. Składnia jest prawdopodobnie podobna do table.field.
Anthony
64

Jeśli potrzebujesz często korzystać z LIKE, możesz nieco uprościć problem. W modelu dziedziczącym elokwentny ORM można utworzyć niestandardową metodę, taką jak ():

public  function scopeLike($query, $field, $value){
        return $query->where($field, 'LIKE', "%$value%");
}

Więc możesz użyć tej metody w taki sposób:

User::like('name', 'Tomas')->get();
Jarosław
źródło
Jest to bardziej „Laravel” sposób na zrobienie tego. Jest po prostu czystszy i pozwala na regulację lunety w jednym miejscu, zamiast konieczności chodzenia i dostosowywania każdego ->where().
Daniel Dewhurst
naprawdę podoba mi się ta odpowiedź. To sprawia, że ​​model i jego użytkowanie jest bardzo eleganckie, o co chodzi w laravel.
Deathemperor
29

FYI, lista operatorów (zawierających podobne i wszystkie inne) jest w kodzie:

/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

protected $operators = array(
    '=', '<', '>', '<=', '>=', '<>', '!=',
    'like', 'not like', 'between', 'ilike',
    '&', '|', '^', '<<', '>>',
    'rlike', 'regexp', 'not regexp',
);

zrzeczenie się:

Odpowiedź Joela Larsona jest prawidłowa. Mam moje poparcie.

Mam nadzieję, że ta odpowiedź rzuci więcej światła na to, co jest dostępne za pośrednictwem Eloquent ORM ( wskazuje ludziom właściwe bezpośrednie ). Chociaż odsyłacz do dokumentacji byłby znacznie lepszy, okazał się on nieuchwytny.

dean grande
źródło
18

Użyj podwójnych cudzysłowów zamiast pojedynczego cudzysłowu, np .:

where('customer.name', 'LIKE', "%$findcustomer%")

Poniżej mój kod:

public function searchCustomer($findcustomer)
{
    $customer = DB::table('customer')
                  ->where('customer.name', 'LIKE', "%$findcustomer%")
                  ->orWhere('customer.phone', 'LIKE', "%$findcustomer%")
                  ->get();

    return View::make("your view here");
}
Myint Thu Lwin
źródło
3

Jeśli nie lubisz podwójnych cudzysłowów jak ja, to zadziała z pojedynczymi cudzysłowami:

$value = Input::get('q');
$books = Book::where('name', 'LIKE', '%' . $value . '%')->limit(25)->get();

return view('pages/search/index', compact('books'));
Sinan Eldem
źródło