我会尽力解释我自己。不是 100% 确定如何措辞。我在多个表中有类似的数据
tbl_rooms
tbl_tables
tbl_people_sitting_at_table
所有这些表都有链接 ID,我想做的是构建一个“房间”对象,而不是在循环中查询数据库。现在我所拥有的是这样的 伪代码
foreach ($rooms as $room) {
$room->tables = get_all_the_table_by_room_id($room->room_id);
.....
foreach ($room->tables as $table) {
$table->people_sitting_at_table = get_all_the_people_by_table_id($table->table_id);
我有什么工作,但我不喜欢构建对象所需的查询量。这是我希望发回的示例
stdClass Object
(
[id] => 15
[room_name] => room_name
[tables] => Array
(
[0] => stdClass Object
(
[id] => 34
[table_name] => table_name
[people_sitting_at_table] => Array
(
[0] => stdClass Object
(
[id] => 45
[name] => name
我遇到困难的是,如果我要预先获取所有数据,我知道如何组织所有这些。如果我得到房间里的所有 table ,然后所有 table 上的所有人,我该怎么办让人们有效地嵌套在正确的 table 下 不确定这些信息是否足够让我明白,如果没有让我知道 下面是一些 SQL 示例
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE `tbl_people_sitting_at_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`table_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `tbl_people_sitting_at_table` (`id`, `name`, `table_id`) VALUES
(1, 'jim', 1),
(2, 'bob', 1);
CREATE TABLE `tbl_rooms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `tbl_rooms` (`id`, `name`) VALUES
(1, 'room one'),
(2, 'room two');
CREATE TABLE `tbl_tables` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`room_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `tbl_tables` (`id`, `name`, `room_id`) VALUES
(1, 'table one', 1),
(2, 'table two', 1);
最佳答案
我认为您正在寻找称为模型映射器设计模式的东西。
您的模型是一个简单的类,用于将列存储在数据库中。每行创建一个模型实例。映射器执行您实际的 sql 查询,然后将每一行加载到一个新的模型实例中。因此,例如,您将拥有一个房间模型和一个房间映射器。然后你有一个 PersonRoom 模型和一个 PersonRoom 映射器。 PersonRoom 映射器可以让您选择所有具有给定房间 ID 的 PersonRoom。
你可以看看为你做这件事的一件事是 Doctrine。或者,您可以自己编写。我写了一个代码生成器,这样我只需将代码生成器指向表格,它就会为我编写模型/映射器代码。然后我可以只使用模型和映射器。
关于php - 寻找有关从查询结果构建对象的建议/最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18320353/