Undefined variable when it is defined

Viewed 616

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?

3 Answers

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;

}

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.

Replace:

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

by:

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