Пишу систему бронирования номеров в гостинице. У меня в базе одна таблица со всеми номерами в гостинице (номерами). Следующий стол - резервация. Мне нужно написать функцию, в которую мне будет передана дата, время начала и окончания брони, и что бы эта функция возвращала мне все свободные номера в заданный срок. Я не знаю, как укусить его полностью. Может ли кто-нибудь направить меня?
Думал получить все номера, потом все брони, с отгрузкой к назначенной дате, а что дальше? Как это все устроить?
@редактировать
Таблица номеров:
- id
- number
Стол для бронирования:
- id
- room_id
- date
- time_start
- time_finish
Я добавил структуру таблиц
Это лучше сделать в SQL, а не в функции php.
Вы можете сделать что-то вроде этого:
select rooms.* from rooms
left join reservations
on rooms.id = reservations.room_id
and reservations.date = '2019-05-28' and reservations.time_start < '14:00' and reservations.time_finish > '14:00'
where reservations.id is null
Если тестовая схема выглядит так:
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE `reservations` (
`id` int(11) NOT NULL,
`room_id` int(11) NOT NULL,
`date` date NOT NULL,
`time_start` time NOT NULL,
`time_finish` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `reservations` (`id`, `room_id`, `date`, `time_start`, `time_finish`) VALUES
(0, 2, '2019-05-28', '13:00:00', '16:00:00');
CREATE TABLE `rooms` (
`id` int(11) NOT NULL,
`name` varchar(15) NOT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `rooms` (`id`, `name`) VALUES
(1, 'room1'),
(2, 'room2');
Пример скрипки:
http://sqlfiddle.com/#!9/f82a5c/1
Я переписал ваш код для синтаксиса CodeIgniter: $query = $this->db->join('reservations', 'rooms.id = reservations.room_id', 'left') ->where('reservations.id IS NULL', null, false) ->where('reservations.date', $date) ->where('reservations.time_start<=', $time_start) ->where('reservations.time_finish>=', $time_finish) ->get('rooms');
. Моя таблица бронирований пуста, поэтому результат $query должен возвращать все комнаты, но тоже пуст :(
Я действительно не знаю codeigniter, но у вас должны быть все части reservations.date и time_start/time_finish в соединении. В предложении where должно идти только бронирование.id является нулевой частью. Попробуйте что-то вроде этого: $query = $this->db->join('reservations', "rooms.id = reservations.room_id and reservations.date = '{$date}' and reservations.time_start<= '{$time_start}' and reservations.time_finish>='{$time_finish}'", 'left') ->where('reservations.id IS NULL', null, false)->get('rooms');
Я думаю, вы можете сделать все это с помощью простого объединенного SQL-запроса. Можете ли вы поделиться примерами данных таблицы?