У меня есть следующий запрос (обрезанный), чтобы перечислить комнаты для бронирования:
$buildquery=Room::
with(['hotel' => function ($query) {
$query->where('status', 0);
}])
->with('image')->with('amenities');
if ($request->filled('location_id')) {
$buildquery->Where('city', $request->location_id);
}
$buildquery->Where('astatus', 1)->Where('status', 0);
$rooms = $buildquery->simplePaginate(20);
Фактический запрос (не обрезается):
select 'rooms'.*,
(select count(*) from 'amenities' inner join 'amenities_room' on 'amenities'.'id' = 'amenities_room'.'amenities_id' where 'rooms'.'id' = 'amenities_room'.'room_id' and 'amenities_id' in (?)) as 'amenities_count'
from
'rooms'
where 'city' = ? and 'price' between ? and ? and 'astatus' = ? and 'status' = ? having
'amenities_count' = ?
limit 21 offset 100
В нем перечислены все номера, доступные в отеле. Мне нужно выбрать только одну комнату для одного отеля с наименьшей ценой.
Hotel::with('room' => function($query) {
$query->orderBy('price', 'asc')->first();
},
'room.images',
'room.roomTypes',
'room.amenities'])
->get();
Вы можете сделать что-то подобное, чтобы получить структуру вроде:
{
'Hotel': {
'Room': {
'Images': {
//
},
'roomTypes': {
//
},
'amenities': {
//
}
}
}
}
Это то, что вы хотите?
Вы можете use order by
$buildquery->orderBy('COL_NAME', 'DESC')->get();
если вам нужен только один, вы можете использовать take(1)
Hotel::with('room' => function($query) { $query->orderBy('price', 'asc')->first(); }]) ->get();