【问题标题】:Filter 2 arrays with object in php在php中用对象过滤2个数组
【发布时间】:2019-10-14 01:12:54
【问题描述】:

我编写了一个酒店房间的预订系统。 我在数据库中有一张包含酒店(房间)所有房间的表。下一张桌子是预订。我需要编写一个函数,为我提供预订的日期、开始和结束时间,并且该函数将在给定的时间限制内将所有空闲房间归还给我。我不知道如何完全咬它。有人可以指导我吗?

我正在考虑获得所有房间,然后是所有预订,以及发货到活动日期,但接下来呢?怎么安排?

@编辑

房间表:

- id
- number

预订表:

- id
- room_id
- date
- time_start
- time_finish

【问题讨论】:

  • 我认为您可以通过一个简单的连接 sql 查询来完成这一切。可以分享示例表数据吗?
  • 我添加了表格结构
  • 这在 SQL 而不是 php 函数中做得更好

标签: php arrays filtering codeigniter-3


【解决方案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-&gt;db-&gt;join('reservations', 'rooms.id = reservations.room_id', 'left') -&gt;where('reservations.id IS NULL', null, false) -&gt;where('reservations.date', $date) -&gt;where('reservations.time_start&lt;=', $time_start) -&gt;where('reservations.time_finish&gt;=', $time_finish) -&gt;get('rooms');。我的预订表是空的,所以 $query 结果应该返回所有房间但也是空的:(
  • 我不太了解 codeigniter,但您应该将 reservations.date 和 time_start/time_finish 部分全部加入。在 where 子句中应该只有 reservations.id 为空部分。试试这样的:$query = $this-&gt;db-&gt;join('reservations', "rooms.id = reservations.room_id and reservations.date = '{$date}' and reservations.time_start&lt;= '{$time_start}' and reservations.time_finish&gt;='{$time_finish}'", 'left') -&gt;where('reservations.id IS NULL', null, false)-&gt;get('rooms');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多