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!


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

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

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.


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");
}

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'));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.