Odpowiednik Laravel-5 `` LIKE '' (elokwentny)

143

Używam poniższego kodu, aby pobrać niektóre wyniki z bazy danych za pomocą Laravel 5.

BookingDates::where('email', Input::get('email'))->orWhere('name', 'like', Input::get('name'))->get()

Jednak orWhereLike nie wydaje się pasować do żadnych wyników. Co daje ten kod pod względem instrukcji MySQL?

Próbuję osiągnąć coś takiego:

select * from booking_dates where email='[email protected]' or name like '%John%'
V4n1ll4
źródło

Odpowiedzi:

380

Jeśli chcesz zobaczyć, co jest uruchamiane w bazie danych, użyj polecenia, dd(DB::getQueryLog())aby zobaczyć, jakie zapytania zostały uruchomione.

Spróbuj tego

BookingDates::where('email', Input::get('email'))
    ->orWhere('name', 'like', '%' . Input::get('name') . '%')->get();
Paweł Bieszczad
źródło
35
czy to zapytanie sql injection jest chronione?
partho
23
@partho Yes. Laravel ekranuje cały ciąg przekazany jako trzeci argument wheremetody.
Finesse
8
Chociaż jest chroniony przed iniekcją, możesz chcieć sprawdzić nieoczekiwany% w danych wejściowych użytkownika. Np. LIKE "% John%" i LIKE "John%" działają inaczej (możesz chcieć tylko to drugie). Weź również pod uwagę puste dane wejściowe, a następnie sam „%”, co również może prowadzić do niezamierzonych wyników z powyższego kodu.
Ian Fleeton,
4
Zgadzam się z Ianem. Laravel tylko częściowo ucieka. Nadal jest wiele psot, jeśli nie uciekniesz odpowiednio przed LIKE. Oto jak: stackoverflow.com/a/42028380/329062
Greg
9
$data = DB::table('borrowers')
        ->join('loans', 'borrowers.id', '=', 'loans.borrower_id')
        ->select('borrowers.*', 'loans.*')   
        ->where('loan_officers', 'like', '%' . $officerId . '%')
        ->where('loans.maturity_date', '<', date("Y-m-d"))
        ->get();
sadiq rashid
źródło
-> gdzie ('license_officers', 'like', '%'. $ officId. '%') gdzie credit_officers jest polem z
numerami seryjnymi
7

Mam do tego zakresy, mam nadzieję, że to komuś pomoże.

public function scopeWhereLike($query, $column, $value)
{
    return $query->where($column, 'like', '%'.$value.'%');
}

public function scopeOrWhereLike($query, $column, $value)
{
    return $query->orWhere($column, 'like', '%'.$value.'%');
}

Stosowanie:

$result = BookingDates::whereLike('email', $email)->orWhereLike('name', $name)->get();
Oleg
źródło
5

Myślę, że tak jest lepiej, kierując się dobrymi praktykami przekazywania parametrów do zapytania:

BookingDates::whereRaw('email = ? or name like ?', [$request->email,"%{$request->name}%"])->get();

Możesz to zobaczyć w dokumentacji Laravel 5.5.

Możesz także skorzystać ze scouta Laravel i ułatwić sobie wyszukiwanie. Oto dokumentacja.

JaredDmz
źródło