2017-09-11 13 views
0

私はLaravel 5.4を使用しています。Eloquent/DBは2か月間に月を取得します

start_dateend_dateを含むBookingモデルがあります。ユーザーは、ドロップダウンリストから1か月を選択します。

Eloquentは、月がstart_dateend_dateの境界にあるすべてのレコードを返すようにします。

例えば予約の前(または9月に開始した場合でも(9月にあるすべての予約を表示)AND(論理値)9月以降で終わる。

任意の提案は歓迎されるであろう。ハッピーこれがされるようにするにはニーズは、生のSQL文を可能ならば

+0

それはあなたが試してみました何https://stackoverflow.com/a/46098040/7155723 –

+0

またはこのhttps://stackoverflow.com/a/46096498/7155723 –

+0

を助けるだろうか? – Gammer

答えて

0

まず、クライアント側またはサーバー側でのようなものを選ん月のユーザーを解析:。その後

$selected = "2017-09"; 

Booking::where([ 
    ['start_time','>', $selected], 
    ['end_time','<', $selected] 
])->get() 
+0

これはあなたが望んだとおりには始まりませんが、これは始まりです。 – Anders

+0

あなたのお手伝いをありがとう - 私はこれで後でプレイします! – Ows

0

これは動作するようです:

$bookings = DB::table('bookings') 
      ->whereMonth('start_date', '<', $date->month)->whereMonth('end_date', '>=', $date->month) 
      ->orWhere(function($query) use ($date) { 
       $query->whereMonth('start_date', $date->month); 
      })->get(); 
1

これは私のために働いていたものです:

$start = Carbon::now()->addMonth(-1); 
$end = Carbon::now()->addMonth(); 

$bookings = Booking::whereRaw('MONTH(created_at) > :0 AND MONTH(created_at) < :1',[ 
    $start->month, $end->month 
]) 
->orWhereRaw('MONTH(created_at) = :3 AND DAYOFMONTH(created_at) >= :4', [ 
    $start->month, $start->day 
]) 
->orWhereRaw('MONTH(created_at) = :5 AND DAYOFMONTH(created_at) <= :6', [ 
    $end->month, $end->day 
]) 
->get(); 

あなたは開始日と終了日を除外したい場合は、<><=>=を置き換えることができます。

また、$start$endの日付を変更する必要があります。オブジェクトはCarbon\Carbonである必要があります。

+0

Fab。ありがとうございました。 – Ows

+1

@Owsこの投稿があなたの質問に答えている場合は、それを承認済みとしてマークしてください:) –

0

かなり簡単でしょう。

「月」の形式はわかりませんが、DateTimeオブジェクトを取得するにはDateTime::createFromFormat()を使用する必要があります。おなじみの方は、Carbonをお気軽にご利用ください。私はこれのような単純なものを見つけると、それは不必要な複雑さを追加しています。

それを使用してクエリします。

Booking::whereBetween($dateTime->format('Y-m-00'), [DB::raw('start_date'), DB::raw('end_date')])->get(); 
関連する問題