2017-12-20 8 views
0

룸 예약을 위해 laravel에서 프로젝트를 진행했습니다. 날짜를 선택할 수있는 캘린더가 있습니다. 예약 날짜가 여름인지 겨울인지 확인해야합니다. 계절이 아니라면 "계절의 시간이 아니 어서 미안"이라는 메시지를 보여주세요.예약 날짜를 확인하는 방법은 여러 시즌의 계절 시간대에 있습니까?

나는 약간의 코드를 시도했습니다. 이 코드는 테이블에 항목이 하나만있는 경우 작동합니다. 아래에 나와있는 세부 사항을 확인하고 도와주십시오. 감사.

시즌 (테이블)

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