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='[email protected]' or name like '%John%'
V4n1ll4
fuente

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();
Pawel Bieszczad
fuente
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();
sadiq rashid
fuente
-> 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();
Oleg
fuente