2017-12-20 9 views
0

私は予約部屋のためのlaravelのプロジェクトを持っています。日付を選択するカレンダーがあります。私は予約の日が夏か冬かをチェックする必要があります。シーズンでない場合は、「シーズン時間ではない」というメッセージを表示します。予約の日付を確認するにはどうすれば複数のシーズンからシーズンの時間に来ることができますか?

私はいくつかのコードを試しました。このコードは、テーブルにエントリが1つしかない場合に機能します。下記の内容を確認して助けてください。ありがとう。

シーズン(表)

id summer summer_open summer_close winter winter_open winter_close hotel 

1 2018 2018-05-01 2018-09-20 2017 2017-11-01 2018-04-20 1 
2 2019 2019-05-01 2019-09-20 2018 2018-11-01 2019-04-20 1 
3 2018 2018-05-01 2018-09-20 2017 2017-11-01 2018-04-20 2 
4 2019 2019-05-01 2019-09-20 2018 2018-11-01 2019-04-20 2 

コード

<?php 

protected function generateDates($now, $end){ 
    $period = new DatePeriod(
     new DateTime($now), 
     new DateInterval('P1D'), 
     new DateTime($end) 
); 

    return $period; 
} 

public function checkAvailability(Request $request){ 
$dateBegin   = $request->dateFrom //2019-09-17; 
$dateEnd    = $request->dateTo //2019-09-22; 

/* generating dates b/w two dates */ 
$generateBookingDates = $this->generateDates($dateBegin, $dateEnd); 

/* selecting seasons */ 
$seasons    = Season::where('hotel', $request->hotelId)->get(); 

foreach ($generateBookingDates as $key => $generateBookingDate) { 
    $generateBookingDat = $generateBookingDate->format('Y-m-d'); //2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21 

    /* Checking season begin */ 
    foreach($seasons as $season) { 

    if(($generateBookingDat >= ($season->summer_open)->format('Y-m-d')) && ($generateBookingDat < ($season->summer_close)->format('Y-m-d'))) 
    { 
    print_r($generateBookingDat. ' booked on summer season '); 
    } 
    elseif(($generateBookingDat >= ($season->winter_open)->format('Y-m-d')) && ($generateBookingDat < ($season->winter_close)->format('Y-m-d'))) 
    { 
    print_r($generateBookingDat. ' booked on winter season '); 
    } 
    else { 
     print_r($generateBookingDat. ' Sorry not a season time '); 
    } 

    } 
    /* Checking season end*/ 

} 

} 

?> 
+0

テーブルに複数のエントリがある場合は、どのような問題がありますか? – Geshode

+0

@Geshode、複数のエントリーがある場合、毎回私は「シーズンタイムではない」を得ています。 –

+0

あなたは明らかにシーズン外です –

答えて

0

あなたは年によっては複数のシーズンを持っているとして、あなたは、予約日が有効であるときにループを破ることがあります。

foreach ($generateBookingDates as $key => $generateBookingDate) { 
    $generateBookingDat = $generateBookingDate->format('Y-m-d'); //2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21 

    $bookingDateSeason  = null; 
    $bookingDateSeasonType = null; 

    /* Checking season begin */ 
    foreach($seasons as $season) { 
     if(($generateBookingDat >= ($season->summer_open)->format('Y-m-d')) && ($generateBookingDat < ($season->summer_close)->format('Y-m-d'))) 
     { 
      $bookingDateSeasonType = 'summer'; 
      $bookingDateSeason  = $season; 
      /* Stop the loop here at the first valid season */ 
      break; 
     } 
     elseif(($generateBookingDat >= ($season->winter_open)->format('Y-m-d')) && ($generateBookingDat < ($season->winter_close)->format('Y-m-d'))) 
     { 
      $bookingDateSeasonType = 'winter'; 
      $bookingDateSeason  = $season; 
      /* Stop the loop here at the first valid season */ 
      break; 
     } 
    } 

    if ($bookingDateSeason && $bookingDateSeasonType) 
    { 
     print_r($generateBookingDat . ' booked on ' . $bookingDateSeasonType . ' season ' . $bookingDateSeason->{$bookingDateSeasonType}); 
    } 
    else 
    { 
     print_r($generateBookingDat . ' Sorry not a season time '); 

    } 
} 

// 2019-09-17 booked on summer season 2019 
// 2019-09-18 booked on summer season 2019 
// 2019-09-19 booked on summer season 2019 
// 2019-09-20 Sorry not a season time 
// 2019-09-21 Sorry not a season time 

このコードはトリックを行うべきですが、私の意見では、予約日の年に基づいてシーズンを最初に検索する必要があります。このようにして、複数の季節にループすることを避けることができます。

/* generating dates b/w two dates */ 
$generateBookingDates = $this->generateDates($dateBegin, $dateEnd); 

/* selecting seasons */ 
//$seasons    = Season::where('hotel', $request->hotelId)->get(); <--- Don't need this line anymore 

foreach ($generateBookingDates as $key => $generateBookingDate) { 
    $generateBookingDat = $generateBookingDate->format('Y-m-d'); //2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21 

    $bookingYear = $generateBookingDate->format('Y'); 
    $season  = /* Season::where('hotel', $request->hotelId)->get(); ... and where year = $bookingYear */ 

    if(($generateBookingDat >= ($season->summer_open)->format('Y-m-d')) && ($generateBookingDat < ($season->summer_close)->format('Y-m-d'))) 
    { 
     print_r($generateBookingDat. ' booked on summer season '); 
    } 
    elseif(($generateBookingDat >= ($season->winter_open)->format('Y-m-d')) && ($generateBookingDat < ($season->winter_close)->format('Y-m-d'))) 
    { 
     print_r($generateBookingDat. ' booked on winter season '); 
    } 
    else 
    { 
     print_r($generateBookingDat. ' Sorry not a season time '); 
    } 
} 

// 2019-09-17 booked on summer season 
// 2019-09-18 booked on summer season 
// 2019-09-19 booked on summer season 
// 2019-09-20 Sorry not a season time 
// 2019-09-21 Sorry not a season time 
+0

@brtrnd、ありがとうございました。それは完璧に働いています。 –

0

私は、テーブル構造を改善する必要があるとしたら、このような状況を処理する必要があります。あなたのテーブルには、次のようになります。 - あなたが行うことができ、同じ機能の後

id season_type open_date close_date hotel year 
1 winter 2018-05-01 2018-09-20  1  2018 
2 summer 2019-05-01 2019-09-20  1  2019 
3 summer 2018-05-01 2018-09-20  2  2018 
4 summer 2019-05-01 2019-09-20  2  2019 
if you want to save year you can save 

: -

$seasons = Season::where('hotel',1)->get(); 
Example 1:- 
$dateBegin = 2019-09-17; 
$dateEnd = 2019-09-22; 
Example 2:- 
$dateBegin = 2019-09-17; 
$dateEnd = 2019-09-19; 

foreach($seasons as $key=> $season){ 
    if($season->open_date >= $dateBegin && $season->close_date <= $dateEnd){ 
     print_r('booked on .'$season->season_type'. season '); //save this in one array variable 
    }else{ 
     print_r(Sorry not a season time'); 
    } 
} 

あなたは本当にあなたが将来的に多くの問題に直面するだろう、あなたのテーブル構造を使用している場合。うまくいきたいです

+0

この回答ありがとうございます。しかし、現在の状況で私はテーブルの構造を更新することはできません。 –

+0

@samsamようこそ – kunal

関連する問題