在酒店预订系统上工作时,我卡在了检查可用房间上
working on hotel reservation system and I get stuck on check avaibility room
这是我的数据库结构:
- 房间:
roomId-roomName-roomCapacity
- 预订:
rsId-rsroomId-date_in-date_out
我想创建搜索可用房间的搜索功能。
我无法获得那些天没有预订的可用的。
我已经尝试了很多东西,但直到现在还无法解决这个问题。
这是我的最新代码:
function search ($name, $date_in, $date_out) {
$this->db->select('*')->from('Rooms');
$this->db->join('Reservation', 'rooms.roomid = reservation.rsroomId', 'LEFT');
$this->db->like('date_in', $date_in);
$this->db->like('date_out', $date_out);
$this->db->like('roomName', $name);
return $this->db->get()->result_array();
}
谢谢
我不是很熟悉 CodeIgniter 构建查询的方式,但我明白你想要实现什么。原始查询看起来像这样:
SELECT Rooms.*
FROM Rooms
LEFT JOIN Reservation
ON Rooms.roomId = Reservation.rsroomId
AND date_in < '$date_out' AND date_out > '$date_in'
WHERE rsId IS NULL;
对于select所有JOIN ON
条件下的重叠预留,您必须将现有预留的date_in
与所需预留的$date_out
进行比较,反之亦然.如果现有预订在您要入住之前退房,则不会重叠。如果现有预订在您要退房后入住,则不会重叠。
精心设计这些 JOIN ON
条件以获得重叠预订后,WHERE rsId IS NULL
条件可确保您只获得不存在此类现有重叠预订的房间。
最后一部分在 CodeIgniter 中很容易,但是将所有三个 JOIN ON
条件放入 $this->db->join()
会很麻烦。 like()
和 where()
函数会自动转义您的值,但在这里您需要手动添加此保护以防止 SQL 注入。也许是这样的:
function search ($date_in, $date_out) {
// Ensuring these values are safe in raw SQL:
$date_in = $this->db->escape($date_in);
$date_out = $this->db->escape($date_out);
$joinCondition = 'rooms.roomid = reservation.rsroomId';
$joinCondition .= " AND date_in < $date_out AND date_out > $date_in";
$this->db->select('*')->from('Rooms');
$this->db->join('Reservation', $joinCondition, 'LEFT');
$this->db->where('rsId', NULL);
return $this->db->get()->result_array();
}
另一种方法是在原始查询中放置问号,这样 CodeIgniter 就可以通过查询绑定转义您的值:
function search ($date_in, $date_out) {
$sql = "SELECT Rooms.*
FROM Rooms
LEFT JOIN Reservation
ON Rooms.roomId = Reservation.rsroomId
AND date_in < ? AND date_out > ?
WHERE rsId IS NULL";
$binds = [$date_out, $date_in];
return $this->db->query($sql, $binds)->result_array();
}
这是我的数据库结构:
- 房间: roomId-roomName-roomCapacity
- 预订: rsId-rsroomId-date_in-date_out
我想创建搜索可用房间的搜索功能。 我无法获得那些天没有预订的可用的。 我已经尝试了很多东西,但直到现在还无法解决这个问题。 这是我的最新代码:
function search ($name, $date_in, $date_out) {
$this->db->select('*')->from('Rooms');
$this->db->join('Reservation', 'rooms.roomid = reservation.rsroomId', 'LEFT');
$this->db->like('date_in', $date_in);
$this->db->like('date_out', $date_out);
$this->db->like('roomName', $name);
return $this->db->get()->result_array();
}
谢谢
我不是很熟悉 CodeIgniter 构建查询的方式,但我明白你想要实现什么。原始查询看起来像这样:
SELECT Rooms.*
FROM Rooms
LEFT JOIN Reservation
ON Rooms.roomId = Reservation.rsroomId
AND date_in < '$date_out' AND date_out > '$date_in'
WHERE rsId IS NULL;
对于select所有JOIN ON
条件下的重叠预留,您必须将现有预留的date_in
与所需预留的$date_out
进行比较,反之亦然.如果现有预订在您要入住之前退房,则不会重叠。如果现有预订在您要退房后入住,则不会重叠。
精心设计这些 JOIN ON
条件以获得重叠预订后,WHERE rsId IS NULL
条件可确保您只获得不存在此类现有重叠预订的房间。
最后一部分在 CodeIgniter 中很容易,但是将所有三个 JOIN ON
条件放入 $this->db->join()
会很麻烦。 like()
和 where()
函数会自动转义您的值,但在这里您需要手动添加此保护以防止 SQL 注入。也许是这样的:
function search ($date_in, $date_out) {
// Ensuring these values are safe in raw SQL:
$date_in = $this->db->escape($date_in);
$date_out = $this->db->escape($date_out);
$joinCondition = 'rooms.roomid = reservation.rsroomId';
$joinCondition .= " AND date_in < $date_out AND date_out > $date_in";
$this->db->select('*')->from('Rooms');
$this->db->join('Reservation', $joinCondition, 'LEFT');
$this->db->where('rsId', NULL);
return $this->db->get()->result_array();
}
另一种方法是在原始查询中放置问号,这样 CodeIgniter 就可以通过查询绑定转义您的值:
function search ($date_in, $date_out) {
$sql = "SELECT Rooms.*
FROM Rooms
LEFT JOIN Reservation
ON Rooms.roomId = Reservation.rsroomId
AND date_in < ? AND date_out > ?
WHERE rsId IS NULL";
$binds = [$date_out, $date_in];
return $this->db->query($sql, $binds)->result_array();
}