2016-11-04 25 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(); 

このアプローチの問題は、それは本当に一部の重複を考慮していないということです。上記の例では、私の検索日は実際にはデータのそれ以上ですが、終了日は実際にはデータの終了日よりも大きいので、返されません。

明白なのは第2規定を作成することですが、orWhereですが、文字通り、日付未満のすべてのデータが機能しません。

私の検索範囲の一部がデータ範囲内にあるかどうかを確認する必要があります。もしそうなら、私がこれをどのように達成できるかについての考えも可能ですか?

+0

データセットの終了日が終了日よりも長くなると、それが返されないと思いますか?クエリは、比較を行うときに最大の日付が何であるか気にしません。うまく動作するはずです。 –

+0

ユーザーがデータの終了日よりも長い終了日を検索している場合、 '<= '句は満たされず、データを返しません。ユーザーは2017-02-04を入力します。これは2017-01-31以下でないため、戻されません。 –

+0

そのロジックは、「end_dateが2017-02-04以下のレコードを私に渡す」と英語で読むことができます。 「2017-01-31」は実際にその日付よりも小さいので、開始日の条件がAFTER 2017-01-31でない限り返されます。それが動作していない場合は、他の何かが間違っています。 –

答えて

2

提供された2つの日付のいずれかがデータの範囲内にあるかどうかを確認します。私は論理的な流出を避けるためにネストされたwheresを使用します。

+0

これは完璧でした。私はコンパイラの点で少し修正する必要がありましたが、これはまさに私が探していたものです! –