Laravel-5 equivalente 'LIKE' (Eloquent)


142

Estou usando o código abaixo para obter alguns resultados do banco de dados com o Laravel 5.

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

No entanto, o orWhereLike não parece corresponder a nenhum resultado. O que esse código produz em termos de instruções do MySQL?

Estou tentando conseguir algo como o seguinte:

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

Respostas:


379

Se você deseja ver o que é executado no banco de dados, use dd(DB::getQueryLog())para ver quais consultas foram executadas.

Tente isto

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

35
esta consulta sql injeção está protegida?
partho 23/07

23
@partho Sim. O Laravel seleciona toda a string que você passa como o terceiro argumento do wheremétodo.
quer

8
Enquanto a injeção estiver protegida, convém verificar% inesperado na entrada do usuário. Por exemplo, LIKE "% John%" e LIKE "John%" apresentam desempenho diferente (você pode apenas pretender o último). Considere também a entrada vazia e somente "%", o que também pode levar a resultados não intencionais do código acima.
Ian Fleeton

4
Concordou com Ian. O Laravel faz apenas escape parcial. Ainda há muita brincadeira possível se você não escapar adequadamente do LIKE. Aqui está 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();

-> onde ( 'loan_officers', 'como', '%' $ officerId '%'..), onde loan_officers é o campo serializado
sadiq Rashid

7

Eu tenho escopos para isso, espero que ajude alguém.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.