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

时间:2013-08-19 18:14:02

标签: php object nested

我会尽力解释自己。不是100%肯定如何说这个。我有多个表格中的数据,如

tbl_rooms
tbl_tables
tbl_people_sitting_at_table

所有这些表都有链接id和我想要做的是构建一个“room”对象而不是在循环中查询db。现在我拥有的是这样的东西 伪代码

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);

我有什么工作,但我不喜欢构建对象所需的查询量。 Heres就是我要寄回的一个例子

 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

我很困难的是知道如何组织所有这些,如果我要预先获得所有数据..如果我得到房间里的所有表,然后所有表中的所有人如何我让人们有效地嵌套在正确的桌子下面 如果没有让我知道,不知道这个足够的信息是否足以说明问题 这是exaple的一些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);

1 个答案:

答案 0 :(得分:0)

我认为你正在寻找一种叫做模型映射器设计模式的东西。

您的模型是一个简单的类,用于存储数据库中的列。您每行创建一个模型实例。映射器执行您的实际SQL查询,然后将每一行加载到新的模型实例中。例如,您将拥有Room模型和Room Mapper。然后你有一个PersonRoom模型和一个PersonRoom映射器。 PersonRoom映射器允许您选择具有给定房间ID的所有PersonRooms。

你能看到的一件事是,这对你来说是Doctrine。或者,你可以自己写。我编写了一个代码生成器,以便我可以将代码生成器指向表,它将为我编写模型/映射器代码。然后我可以使用模型和映射器。