Equivalente 'LIKE' di Laravel-5 (eloquente)


143

Sto usando il codice seguente per estrarre alcuni risultati dal database con Laravel 5.

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

Tuttavia, orWhereLike non sembra corrispondere ai risultati. Cosa produce quel codice in termini di istruzioni MySQL?

Sto cercando di ottenere qualcosa di simile al seguente:

select * from booking_dates where email='my@email.com' or name like '%John%'

Risposte:


380

Se vuoi vedere cosa viene eseguito nel database, usa dd(DB::getQueryLog())per vedere quali query sono state eseguite.

Prova questo

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

35
questa query sql injection è protetta?
partho,

23
@partho Sì. Laravel visualizza l'intera stringa che passi come terzo argomento del wheremetodo.
Finesse,

8
Mentre protetto da iniezione potresti voler verificare la percentuale imprevista nell'input dell'utente. Ad esempio, LIKE "% John%" e LIKE "John%" si comportano diversamente (potresti intendere solo quest'ultimo). Considera anche input vuoti, e quindi solo "%", il che potrebbe anche portare a risultati indesiderati dal codice sopra.
Ian Fleeton,

4
D'accordo con Ian. Laravel esegue solo una fuga parziale. C'è ancora un sacco di malizia possibile se non si sfugge correttamente a LIKE. Ecco come: 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();

-> where ('loan_officers', 'like', '%'. $ officerId. '%') dove loan_officers è il campo serializzato
sadiq rashid

7

Ho degli scopi per questo, spero che aiuti qualcuno.

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

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

Uso:

$result = BookingDates::whereLike('email', $email)->orWhereLike('name', $name)->get();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.