每行返回多行(在 Zend 框架中)

Posted

技术标签:

【中文标题】每行返回多行(在 Zend 框架中)【英文标题】:Returning multiple rows per row (in Zend Framework) 【发布时间】:2009-05-20 22:15:32 【问题描述】:

我有一个包含这些表的 mysql 数据库:

sessions
--------
sessionid (INT)
[courseid (INT)]
[locationid (INT)]
[comment (TEXT)]

dates
-----
dateid (INT)
sessionid (INT)
date (DATE)

courses
-------
...

locations
---------
...

每个会话都有一个唯一的 sessionid,每个日期都有一个唯一的 dateid。但日期不一定有唯一的 sessionid,因为会话可以跨越可变数量的日期(不一定是连续的)。

选择每个完整的行只是在 sessionid 上加入表的问题。但是,我正在寻找一种方法来返回特定 courseid 的行集,其中该行集中的每一行代表一个位置,并包含另一个行集,每个行集包含单个会话,该会话又包含另一个行集,其中包含所有该会议的日期:

course
    location
        sesssion
            date
            date
        session
            date
            date
            date
    location
        ...

这是因为我使用 Zend Framework 从 php 查询这个数据库,它有一个很好的接口,可以以面向对象的方式操作行和行集。

最终,我试图向视图输出一个“时间表”,首先按课程组织,然后是位置,然后是日期。理想情况下,我可以将每一行作为一个位置进行迭代,然后针对每个位置,对每个会话进行迭代,然后对每个会话,对每个日期进行迭代。

我正在考虑通过分别查询所有地点、会话和日期来做到这一点。然后,我将每个行集转换为一个数组,并将每个会话数组添加为位置数组的成员,并将每个日期数组添加为会话数组的成员。

然而,这感觉很笨拙,并且没有让我能够以面向对象的方式处理行。

我想知道是否有:

a) 用于表示此数据的更好的表模式;

b) 一个我不知道的 sql 查询;

c) Zend_Db 中允许我将行集分配给行集的方法

如果我在任何地方不清楚,请告诉我,并提前感谢。

(交叉手指说这不会出现在日常的wtf中......)

【问题讨论】:

【参考方案1】:

当我必须处理来自多个表的数据时,我在使用 Zend Frameworks 数据库抽象类时遇到了很多问题。运行的查询数量和生成的所有对象的开销使我的托管服务器陷入困境。从那以后,我又回到编写查询来收集我的所有数据,然后遍历数据来构建我的显示。它不像使用抽象层那样漂亮或面向对象,但它也不会将我的 PHP 脚本页面写入磁盘只是为了显示一个充满数据的表格。

正如 Steve 提到对您最终使用的任何解决方案进行基准测试一样,我也会分析您的内存使用情况。

【讨论】:

+1 我同意,我为 Zend Framework DB 类贡献了很多。这些问题适用于任何 ORM;不仅仅是 Zend 框架。 非常正确,这是一个 ORM 问题,并不特定于 Zend Framework。【参考方案2】:

您可以使用 Zend_Db_Table 的关系特性来处理这种情况。如果您当前使用 Zend_Db_Aadpter 进行查询,则需要为会话、日期、课程等创建表包装类。

http://framework.zend.com/manual/en/zend.db.table.relationships.html

它与您描述的分别查询每个数据集的方法没有太大区别,但它为您提供了一个直接的 OO 接口,用于检索给定记录的适当相关数据。

如果你走这条路,你会想要做一些基准测试,因为它可能会执行很多查询。

【讨论】:

以上是关于每行返回多行(在 Zend 框架中)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Zend 框架 2 将数据插入和更新到两个表(事务)中

如何在不安装 Zend 框架的情况下使用 Zend 库

Zend 框架 2 - 在布局中添加子视图?

file->getMimeType() 总是使用 Zend 框架返回 application/octet-stream

如何使用 zend from 在 zend 框架 2 中添加自定义属性

如何从数组中获取值并在zend框架工作中分配给视图