2016-03-10 86 views
1

嗨誰能幫助我建立以下查詢在laravel雄辯我真的很迷惑中使用條件與我使用Laravel 5使用或與BETWEEN

SELECT * FROM tbl WHERE 
existing_start BETWEEN $newSTart AND $newEnd OR 
$newStart BETWEEN existing_start AND existing_end 
之間

試圖像

whereBetween('existing_start',[$newSTart,$newEnd]) 
條件

但不知道如何使用OR

+0

嘗試在你的子句之間添加parens。 – BPS

回答

1

你是對的,你可以使用Eloqu ent的whereBetween()。對於OR,你應該使用orWhere()https://laravel.com/docs/5.1/queries#advanced-where-clauses

我不是100%肯定,如果它會工作,但你可以試試這個:

$data = DB::table('tbl') 
     ->whereBetween('existing_start', [$newSTart, $newEnd]) 
     ->orWhere(function ($query) { 
      $query->whereBetween($newStart, [existing_start, existing_end]) 
     }) 
     ->get(); 
+0

謝謝,我希望它能工作 – sanu

6

有從查詢生成器提供的orWhereBetween方法,但它在Query Builder Documentation中沒有記錄。但是,您可以在Laravel API Documentation中找到它。下面


的說明假設變量具有以下值:

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

可惜的是,使用orWhereBetween第二個條件不適合你的情況,因爲這兩個whereBetweenorWhereBetween會檢查列值是否在兩個輸入值之間。由於它檢查existing_start列值是否在$newStart$newEnd之間,因此從您的第一個條件開始就沒有問題。因此,這是罰款:

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

因爲它會被編譯爲:

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

但是你的第二個條件要檢查是否從$newStart的輸入值之間的兩列的值existing_startexisting_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') 
+0

謝謝你的信息,我會盡量同時嘗試,希望它能工作 – sanu

+0

是的,這工作完全謝謝 – sanu