Laravel-5 'LIKE' equivalente (Elocuente)


143

Estoy usando el siguiente código para obtener algunos resultados de la base de datos con Laravel 5.

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

Sin embargo, orWhereLike no parece coincidir con ningún resultado. ¿Qué produce ese código en términos de declaraciones MySQL?

Estoy tratando de lograr algo como lo siguiente:

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

Respuestas:


380

Si desea ver qué se ejecuta en la base de datos, use dd(DB::getQueryLog())para ver qué consultas se ejecutaron.

Prueba esto

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

35
¿está protegida esta inyección de inyección SQL?
— partho

23
@partho Sí. Laravel filtra toda la cadena que pasa como tercer argumento del wheremétodo.
— Finesse

8
Mientras esté protegido por inyección, es posible que desee verificar el% inesperado en la entrada del usuario. Por ejemplo, LIKE "% John%" y LIKE "John%" funcionan de manera diferente (es posible que solo pretenda esto último). También considere la entrada vacía, y luego solo "%", lo que también podría conducir a resultados no deseados del código anterior.
— Ian Fleeton

44
De acuerdo con Ian. Laravel solo escapa de forma parcial. Todavía hay muchas travesuras posibles si no escapas adecuadamente del LIKE. Así es como: 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. '%') donde loan_officers es el campo serializado
— sadiq rashid

7

Tengo alcances para esto, espero que ayude a alguien.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.