2 回答
TA贡献1911条经验 获得超7个赞
从选择房间而不是酒店开始,然后按酒店分组可能更简单。
您可以使用原始表达式来获得最低房价:
$raw = DB::raw('min(price) as min_price');
然后从 rooms 表中选择并按酒店 id 分组:
Room::join('hotels', 'hotels.id' ,'=', 'rooms.hotel_id')
->whereDate('rooms.from_date', '<=', $from_date)
->whereDate('rooms.to_date', '>=', $to_date)
->select('hotels.*', $raw)
->groupBy('hotels.id')
->get()
您可能也对Jonathan Reinink 最近的演讲 Eloquent Performance Patterns感兴趣。他谈到了与您类似的查询,看起来他谈到的拉取请求将使此类查询更容易已合并到 Laravel 6.0 中。所以从 Laravel 6.0 开始,你应该可以做这样的事情:
return Hotel::addSelect(['lowest_price' => function ($query) {
$query->select('price')
->from('rooms')
->whereColumn('hotel_id', 'hotels.id')
->orderBy('price', 'asc')
->limit(1);
}])->get();
TA贡献1875条经验 获得超3个赞
像你这样的声音需要在阅读了orderBy
和take
雄辩的文档。
检查Adding Additional Constraints
部分:在https://laravel.com/docs/5.8/eloquent#retrieving-models
- 2 回答
- 0 关注
- 121 浏览
添加回答
举报