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

标签 php object nested

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

相关文章:

php - 插入相同手机号码的不同查询?

javascript - 通过 findIndex 方法比较 'id'

android - 从嵌套的 Android PreferenceScreen 返回到上一个 PreferenceScreen

php - 多维数组中的求和值

php - 如何在mysql字段中保存json字符串

c# - 如何使用反射在运行时创建值类型或字符串类型对象

CSS 继承 : How to override inherited values

javascript - 参数对应: callback vs.闭包(?)

PHP:无法声明类,因为名称已在使用中

javascript - 如何将一个对象添加到另一个对象之前作为更大对象的一部分