Фильтровать 2 массива с объектом в php

Пишу систему бронирования номеров в гостинице. У меня в базе одна таблица со всеми номерами в гостинице (номерами). Следующий стол - резервация. Мне нужно написать функцию, в которую мне будет передана дата, время начала и окончания брони, и что бы эта функция возвращала мне все свободные номера в заданный срок. Я не знаю, как укусить его полностью. Может ли кто-нибудь направить меня?

Думал получить все номера, потом все брони, с отгрузкой к назначенной дате, а что дальше? Как это все устроить?

@редактировать

Таблица номеров:

- id
- number

Стол для бронирования:

- id
- room_id
- date
- time_start
- time_finish

Я думаю, вы можете сделать все это с помощью простого объединенного SQL-запроса. Можете ли вы поделиться примерами данных таблицы?

Exceptional NullPointer 28.05.2019 15:30

Я добавил структуру таблиц

web_newbie 28.05.2019 15:39

Это лучше сделать в SQL, а не в функции php.

dWinder 28.05.2019 15:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать что-то вроде этого:

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 должен возвращать все комнаты, но тоже пуст :(

web_newbie 29.05.2019 13:42

Я действительно не знаю 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');

Exceptional NullPointer 29.05.2019 14:11

Другие вопросы по теме