2

I keep getting this error Undefined variable: checkInDate when I already define it.

public function checkAvailable(Request $request){
    $checkInDate = date("Y-m-d", strtotime($request->start_date));
    $checkOutDate = date("Y-m-d", strtotime($request->end_date));

  $availableRooms = availableRoom::whereHas('reservation',function($query){
        $query->where(function($query){
            $query->whereDate('reservationDate', '>=', $checkInDate);
            $query->whereDate('reservationDate', '<=', $checkOutDate);
        })->orWhere(function($query){
            $query->whereDate('expiryDate', '>=', $checkInDate);
            $query->whereDate('expiryDate', '<=', $checkOutDate);
        });
    })->get();

    return $availableRooms;

}

The checkInDate already has a value. Am I miss something?

Rei
  • 313
  • 2
  • 11
  • 1
    You need to add `use ($checkInDate, $checkOutDate)` to the anonymous function: `..whereHas('reservation',function($query) use ($checkInDate, $checkOutDate) {...` – Jeff Jan 12 '19 at 09:39
  • Both the $checkInDate and $checkOutDate is getting the same error Undefined variable – Rei Jan 12 '19 at 09:40

3 Answers3

1

You need to have a use () added to each function so that the variable is accessible to the function else it only has access to the variables that get passed into.

public function checkAvailable(Request $request){
    $checkInDate = date("Y-m-d", strtotime($request->start_date));
    $checkOutDate = date("Y-m-d", strtotime($request->end_date));

  $availableRooms = availableRoom::whereHas('reservation',function($query) use ($checkInDate, $checkOutDate) {
        $query->where(function($query) use ($checkInDate, $checkOutDate){
            $query->whereDate('reservationDate', '>=', $checkInDate);
            $query->whereDate('reservationDate', '<=', $checkOutDate);
        })->orWhere(function($query) use ($checkInDate, $checkOutDate){
            $query->whereDate('expiryDate', '>=', $checkInDate);
            $query->whereDate('expiryDate', '<=', $checkOutDate);
        });
    })->get();

    return $availableRooms;

}
Brendon Moss
  • 134
  • 5
1

Since you are trying to access the variable within a callback you need to pass the variable to the callback with use statement.

public function checkAvailable(Request $request){ 

$checkInDate = date("Y-m-d", strtotime($request->start_date)); 

$checkOutDate = date("Y-m-d", strtotime($request->end_date)); 

$availableRooms = availableRoom::whereHas('reservation',function($query)use($checkInDate, $checkOutDate){ 
    ...
});

Since your also trying to use $checkOutDate you will also need to pass it through to the callback as well, separating it with a comma.

Azeame
  • 2,322
  • 2
  • 14
  • 30
0

Replace:

 $availableRooms = availableRoom::whereHas('reservation',function($query){

by:

 $availableRooms = availableRoom::whereHas('reservation',function($query) use($checkInDate,$checkOutDate) {
oreopot
  • 3,392
  • 2
  • 19
  • 28