有從查詢生成器提供的orWhereBetween
方法,但它在Query Builder Documentation中沒有記錄。但是,您可以在Laravel API Documentation中找到它。下面
的說明假設變量具有以下值:
$newStart = '1';
$newEnd = '10';
可惜的是,使用orWhereBetween
第二個條件不適合你的情況,因爲這兩個whereBetween
和orWhereBetween
會檢查列值是否在兩個輸入值之間。由於它檢查existing_start
列值是否在$newStart
和$newEnd
之間,因此從您的第一個條件開始就沒有問題。因此,這是罰款:
->whereBetween('existing_start', [$newStart, $newEnd])
因爲它會被編譯爲:
WHERE `existing_start` BETWEEN '1' AND '10'
但是你的第二個條件要檢查是否從$newStart
的輸入值之間的兩列的值existing_start
和existing_end
,並有不是這樣的查詢生成器方法。所以這是行不通的:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
因爲它會被編譯爲:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
通知反引號`
周圍1
,因爲那樣的MySQL將嘗試找到一個名爲1
列,並拋出一個錯誤。
所以這裏最好的選擇是使用像這樣綁定:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
的?
將通過將適當引用和轉義,以避免SQL注入的$newStart
值代替。
或課程總有具有檢查的界限,這將等同於您的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')
嘗試在你的子句之間添加parens。 – BPS