2016-11-04 82 views
0

我很新使用Laravel,但我已經設法創建了一個非常基本的API。我開始嘗試向API添加過濾器,我需要的主要過濾器是查看日期範圍是否與另一個日期範圍重疊。如何搜索另一個範圍與Laravel之間的日期範圍?

例如,這裏是從我的數據庫返回一個典型的數據對象:

{ 
    id: 1, 
    name: 'This is the name', 
    start_date: '2017-01-03', 
    end_date: '2017-01-29' 
} 

在使用者將通常由較小的日期範圍進行過濾。例如,給我起始和結束範圍在2017-01-28和2017-02-04之間的結果。

因此,像:

data start    data end 
    |------------------------| 
     |----------------| 
    search start  search end 

在我的研究,我只能找到答案有關的搜索,如果一個日期在一個範圍內,如果沒有一系列的任何部分落在內的另一個範圍。

這是我目前有:

$closures = Closures::where('start_date', '>=', $from)->where('end_date', '<=', $to)->get(); 

這種方法的問題是,它並沒有真正考慮的部分重疊。在上面的例子中,我的搜索日期確實大於或等於數據的日期,但由於結束日期實際上大於數據的結束日期,所以它不會被返回。

顯而易見的是作出第二個規定,並且orWhere,但是然後它返回字面上所有數據與日期不到的日期不起作用。

我基本上需要檢查我的搜索範圍的任何部分是否在數據範圍內。如果有的話,這甚至是可能的,關於如何實現這一點的任何想法。

+0

是什麼讓你認爲結束日期大於數據集中的最大結束日期會阻止它被返回?該查詢不關心進行比較時的最大日期,並應該工作得很好。 –

+0

如果用戶搜索的結束日期大於數據的結束日期,則不會滿足'<='子句,因此不會返回數據。用戶輸入2017-02-01,不得少於或等於2017-01-31,所以不會返回。 –

+0

這個邏輯可以用英文讀作「給我記錄,其中end_date小於或等於2017-02-04」。由於「2017-01-31」確實少於該日期,因此它將返回,除非開始日期條件在2017-01-31之後。如果它不起作用,那麼還有其他不妥之處。 –

回答

2

你會檢查是否有任何提供的2個日期之間的數據範圍之間。我會使用嵌套wheres來避免任何邏輯溢出。

$closures = Closures::where(function($query) use ($start) { 
    return $query->where('start_date', '<=', $start)->where('end_date', '>=', $start); 
}) 
->orWhere(function($query) use ($end) { 
    return $query->where('start_date', '<=', $end)->where('end_date', '>=', $end); 
}) 
->get(); 
+0

這很完美。我不得不根據比較器進行修改,但這正是我所期待的! –