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')