从查询结果中查找有关构建对象的建议/最佳实践


Looking for advice/best practice on building objects from query results

我会尽力解释自己。不是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

如果我要提前获得所有数据,我很难知道如何组织所有这些。。如果我把所有的桌子都放在房间里,然后把所有桌子上的人都放在桌子上,我该如何有效地把人嵌套在正确的桌子下面不确定这是否足够让我明白我的观点,如果不让我知道以下是示例的一些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的所有PersonRooms。

你可以看到的一件事就是教义。或者,你也可以自己写。我写了一个代码生成器,这样我就可以把代码生成器指向表,它就会为我写模型/映射器代码。然后我就可以使用模型和映射器了。