在酒店预订系统上工作时,我卡在了检查可用房间上

working on hotel reservation system and I get stuck on check avaibility room

这是我的数据库结构:

  1. 房间: roomId-roomName-roomCapacity
  2. 预订: 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();
}