sql >> データベース >  >> RDS >> Mysql

LAravel 5は、OR条件をBETWEENで使用します

    orWhereBetweenがあります メソッドはクエリビルダーから利用できますが、クエリビルダーのドキュメント> 。ただし、LaravelAPIドキュメント> 。

    以下の説明は、変数の値が次のとおりであることを前提としています。

    $newStart = '1';
    $newEnd = '10';
    

    残念ながら、 orWhereBetweenを使用しています 2番目の条件は、どちらも whereBetween であるため、この場合には適用されません。 およびorWhereBetween 列の値が2つの入力値の間にあるかどうかを確認します。これは、existing_start かどうかをチェックするため、最初の条件からは問題ありません。 列の値は$newStartの間にあります および$newEnd 。だからこれは問題ありません:

    ->whereBetween('existing_start', [$newStart, $newEnd])
    

    次のようにコンパイルされます:

    WHERE `existing_start` BETWEEN '1' AND '10'
    

    ただし、2番目の条件では、 $ newStartからの入力値かどうかを確認する必要があります。 2つの列の値の間にあるexisting_start およびexisting_end 、およびそれを行うクエリビルダーメソッドはありません。したがって、これは機能しません:

    ->orWhereBetween($newStart, ['existing_start', 'existing_end'])
    

    コンパイルされるため:

    OR `1` BETWEEN 'existing_start' AND 'existing_end'
    

    バックティック`に注意してください 1周辺 、そのため、MySQLは 1という名前の列を見つけようとします エラーをスローします。

    したがって、ここでの最良のオプションは、 orWhereRawを使用することです。 このようなバインディングで:

    DB::table('tbl')
      ->whereBetween('existing_start', [$newStart, $newEnd])
      ->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
      ->get();
    

    $ newStartの値に置き換えられます これは、SQLインジェクションを回避するために適切に引用され、エスケープされます。

    またはもちろん、境界をチェックする2つのグループ化された条件を設定するオプションが常にあります。これは、 BETWEENと同等です。 状態:

    DB::table('tbl')
      ->whereBetween('existing_start', [$newStart, $newEnd])
      ->orWhere(function ($query) use ($newStart) {
          $query->where('existing_start', '<=', $newStart);
          $query->where('existing_end', '>=', $newStart);
      })->get();
    

    コンパイル先:

    SELECT * FROM `tbl`
    WHERE
      `existing_start` BETWEEN '1' AND '10' OR
      (`existing_start` <= '1' AND `existing_end` >= '1')
    


    1. Oracleパーティションインデックス

    2. 一意ではないテーブル/エイリアス

    3. SQLServer2017管理ツール

    4. CLEAR SCREEN-Oracle SQL Developerのショートカット?