Laravel-5 'LIKE'相当(雄弁)


142

以下のコードを使用して、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%'

回答:


379

データベースで何が実行されているかを確認する場合は、実行されたdd(DB::getQueryLog())クエリを確認するために使用します。

これを試して

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

35
このクエリのSQLインジェクションは保護されていますか?
partho 2017

23
@parthoはい。Laravelは、whereメソッドの3番目の引数として渡した文字列全体をスクリーニングします。
Finesse 2017

8
注入は保護されていますが、ユーザー入力の予期しない%をチェックしたい場合があります。たとえば、LIKE "%John%"とLIKE "John%"のパフォーマンスは異なります(後者のみを意図している場合があります)。また、空の入力、および "%"のみの入力も考慮してください。これも上記のコードから意図しない結果になる可能性があります。
Ian Fleeton

4
イアンに同意しました。Laravelは部分的なエスケープしか行いません。LIKEを適切にエスケープしないと、まだ多くのいたずらが可能です。方法は次のとおりです。stackoverflow.com
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.