3

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

我遇到的困难是知道如何组织所有这些,如果我要预先获得所有数据。如果我把房间里的所有桌子都放在房间里,然后所有桌子上的人都在我怎么能让人有效地嵌套在正确的表格下

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

1 回答 1

0

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

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

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

于 2013-08-19T18:25:30.133 回答