Laravel-5 'LIKE'동등 (Eloquent)


143

Laravel 5를 사용하여 데이터베이스에서 일부 결과를 가져 오기 위해 아래 코드를 사용하고 있습니다.

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

그러나 orWhereLike가 결과와 일치하지 않는 것 같습니다. 이 코드는 MySQL 문장으로 무엇을 생성합니까?

다음과 같은 것을 달성하려고합니다.

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

답변:


380

데이터베이스에서 실행 된 dd(DB::getQueryLog())내용을 보려면 어떤 쿼리가 실행되었는지 확인하십시오.

이 시도

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

35
이 쿼리 sql injection은 보호됩니까?
partho

23
@partho 예. Laravel은 where메소드 의 세 번째 인수로 전달한 전체 문자열을 검사합니다 .
Finesse

8
주입이 보호되는 동안 사용자 입력에서 예기치 않은 %가 있는지 확인할 수 있습니다. 예를 들어 LIKE "% John %"과 LIKE "John %"은 다르게 수행됩니다 (후자 만 의도 할 수 있음). 또한 빈 입력과 "%"만 고려하면 위 코드에서 의도하지 않은 결과가 발생할 수 있습니다.
Ian Fleeton 2018 년

4
이안과 동의 함. 라 라벨은 부분 탈출 만합니다. LIKE를 제대로 탈출하지 않으면 여전히 많은 장난이 있습니다. 방법은 다음과 같습니다. stackoverflow.com/a/42028380/329062
Greg 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. '%') 여기서 loan_officers는 직렬화 된 필드
sadiq rashid

7

나는 이것에 대한 범위가 있으며, 누군가를 돕기를 바랍니다.

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

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

용법:

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.