问题描述
我正在为酒店预订系统,在该系统中,用户输入入住和退房日期,然后他找到该时期内所有可用的酒店和客房,与此同时,我在后端设置了合同,在合同中我分别确定了在特定时期内的房间。
数据库查询应包括在此期间内有效的每份合同,并且此期间的每一天都应包含在合同中。
带有合同查询的酒店
Hotel::with(["contracts" => function($query) use($from,$to,$columns) {
$query->select(
"contracts.*",DB::raw("SUM(contract_rooms.we_price) as total_we_price"),DB::raw("SUM(contract_rooms.wd_price) as total_wd_price"))
->whereBetween("contracts.to_time",[$from,$to])
->orWhereBetween("contracts.from_time",$to])
->orWhere(function ($query) use ($from,$to){
$query->where("contracts.from_time","<",$from)
->where("contracts.to_time",">",$to);
})
->join("contract_rooms","contracts.id","=","contract_rooms.contract_id")
->groupBy("contract_rooms.view_id","contract_rooms.meal_id","contracts.room_type_id")
->orderBy("contract_rooms.wd_price","ASC");
},"reviews"])
->whereHas("contracts",function ($query) use ($from,$to) {
$query->whereBetween("contracts.to_time",$to])
->orWhereBetween("contracts.from_time",$to])
->where(function ($query) use ($from,$to) {
$query->where("contracts.from_time",$from)
->where("contracts.to_time",$to);
});
});
酒店表:
+------------------+-----------+-------------+
| id | hotel_name | city_id | description |
+----+-------------+-----------+-------------+
| 1 | Hilton | 1 | Text |
| 2 | Sheraton | 1 | Text |
| 3 | Aston | 1 | Text |
+----+-------------+-----------+-------------+
RoomType表:
+--------------+-----------+------+
| id | name | room_size | beds |
+----+---------+-----------+------+
| 1 | text | 0 | 2 |
| 2 | text | 1 | 2 |
| 3 | text | 0 | 2 |
+--------------+-----------+------+
合同表:
+-------------+-----------+--------------+------------+-------------+
| id | name | hotel_id | room_type_id | from_time | to_time |
+----+--------+-----------+--------------+------------+-------------+
| 1 | text | 1 | 1 | 2020-10-14 | 2020-10-20 |
| 2 | text | 1 | 1 | 2020-10-21 | 2020-10-30 |
| 3 | text | 1 | 1 | 2020-11-05 | 2020-11-20 |
+----+--------+-----------+--------------+------------+-------------+
例如:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)