每行返回多行(在Zend Framework中)

时间:2009-05-20 22:15:32

标签: php sql mysql database zend-framework

我有一个包含这些表的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中的一个方法,它允许我将行集分配给行集

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

(穿过我的手指,这并不是每天的重量......)

2 个答案:

答案 0 :(得分:2)

当我必须处理来自多个表的数据时,我遇到了使用Zend Frameworks数据库抽象类的许多问题。运行的查询数量和生成的所有对象的开销使我的托管服务器瘫痪了。我已经回过头来编写查询来收集我的所有数据,然后走数据来构建我的显示器。使用抽象层并不是一个漂亮的或OO,但它也没有将我的PHP脚本页面设置为磁盘只是为了显示一个充满数据的表。

正如史蒂夫提到的那样,无论你最终得到什么解决方案,我都会对你的内存使用情况进行分析。

答案 1 :(得分:1)

您可以使用Zend_ Db_ Table的关系功能来处理此场景。如果您当前使用Zend_ Db_ Aadpter作为查询,则需要为会话,日期,课程等创建表包装器类。

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

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

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