在php中用对象过滤2个数组
Posted
技术标签:
【中文标题】在php中用对象过滤2个数组【英文标题】:Filter 2 arrays with object in php 【发布时间】:2019-10-14 01:12:54 【问题描述】:我编写了一个酒店房间的预订系统。 我在数据库中有一张包含酒店(房间)所有房间的表。下一张桌子是预订。我需要编写一个函数,为我提供预订的日期、开始和结束时间,并且该函数将在给定的时间限制内将所有空闲房间归还给我。我不知道如何完全咬它。有人可以指导我吗?
我正在考虑获得所有房间,然后是所有预订,以及发货到活动日期,但接下来呢?怎么安排?
@编辑
房间表:
- id
- number
预订表:
- id
- room_id
- date
- time_start
- time_finish
【问题讨论】:
我认为您可以通过一个简单的连接 sql 查询来完成这一切。可以分享示例表数据吗? 我添加了表格结构 这在 SQL 而不是 php 函数中做得更好 【参考方案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 结果应该返回所有房间但也是空的:(
我不太了解 codeigniter,但您应该将 reservations.date 和 time_start/time_finish 部分全部加入。在 where 子句中应该只有 reservations.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');
以上是关于在php中用对象过滤2个数组的主要内容,如果未能解决你的问题,请参考以下文章