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

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

Eu acho que isso é melhor, seguindo as boas práticas de passar parâmetros para a consulta:

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

Você pode vê-lo na documentação, Laravel 5.5.

Você também pode usar o batedor do Laravel e facilitar a pesquisa. Aqui está a documentação.

JaredDmz
fonte