Laravel: Eloquent HAVING возвращает неверный набор данных - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь получить список отелей, в которых номера доступны на запрошенные даты.

Таблица доступности номеров выглядит следующим образом.

room_availability

id |    hotel   |     room      | start_date |   end_date  | count | 
--------------------------------------------------------------------
1  |     301    |      121      | 2019-04-01 |  2019-04-01 |   10  |
2  |     301    |      121      | 2019-04-02 |  2019-04-02 |   7   | 
3  |     301    |      121      | 2019-04-03 |  2019-04-03 |   4   | 
4  |     301    |      120      | 2019-04-02 |  2019-04-02 |   5   | 
5  |     301    |      120      | 2019-04-03 |  2019-04-03 |   6   |  

И код модели поиска как,


$no_of_days = (Carbon::parse($data['start_date'])
              ->diffInDays(Carbon::parse($data['end_date'])));
$no_of_days += 1;

$hotelList = $this
        ->select('id','hotel_code','room', \DB::Raw('count(hotel_code) as total_days'))
        ->with(['hotel:id,name,logo,location,code'])
        ->where('start_date','>=',$data['start_date'])
        ->Where('start_date','<=',$data['end_date'])
        ->groupBy('hotel_code')
        ->having('total_days',$no_of_days)->get();

Для запроса (2019-04-02 - 2019-04-03) без условия

->having('total_days',$no_of_days)

возвращает отель 301, но при добавлении возвращается пустой набор.

Что я должен добавить или удалить?

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Следующий запрос возвращает мне ожидаемые данные,

$hotelList = $this
        ->select('id','hotel_code','room', \DB::Raw('count(hotel_code) as total_days'))
        ->with(['hotel:id,name,logo,location,code'])
        ->where('start_date','>=',$data['start_date'])
        ->Where('start_date','<=',$data['end_date'])
        ->groupBy('hotel_code','room')
        ->having('total_days',$no_of_days)->get();

Набор должен быть сгруппирован по коду отеля и коду номера, в этом случае данные отеля могут повторяться, что может быть отфильтровано на контроллере.

0 голосов
/ 14 марта 2019

попробуйте следующий запрос,

$no_of_days = (Carbon::parse($data['start_date'])
          ->diffInDays(Carbon::parse($data['end_date'])));
$no_of_days += 1;

$hotelList = $this
    ->select('id','hotel_code','room', \DB::Raw('count(hotel_code) as total_days'))
    ->with(['hotel:id,name,logo,location,code'])
    ->where('start_date','>=',$data['start_date'])
    ->Where('start_date','<=',$data['end_date'])
    ->groupBy('hotel_code')
    ->havingRaw('count(hotel_code) ='. $no_of_days)->get();
...