2009-05-20 55 views
1

我有一个包含这些表MySQL数据库:返回每行多行(Zend框架)

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

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

courses 
------- 
... 

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

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

选择每个完整行仅仅是加入sessionid表上的表格。然而,我正在寻找一种方法来为特定的courseid返回一个行集,其中rowset中的每一行表示一个位置,并且包含另一个行集,每个行集都包含单个会话,而后者又包含另一个行集,其中包含所有日期为会话:

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

这是因为我使用的查询使用Zend Framework,这对在面向对象的方式操纵行和行集出色的界面从PHP这个数据库。

最终,我试图输出一个'计划'的视图,首先由课程,然后地点,然后日期组织。理想情况下,我可以遍历每行作为位置,然后针对每个位置遍历每个会话,然后针对每个会话迭代每个日期。

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

但是,这感觉非常糟糕,并且不能提供以面向对象的方式处理行的能力。

我不知道是否有要么是:

一)表示此数据更好的表模式;

b)我不知道的sql查询;

C)在Zend_Db的方法,让我行集分配给行集

请让我知道,如果我没有在任何地方明确,并在此先感谢。

(穿越我的手指,这不会对日常跆拳道结束了...)

回答

2

当我必须处理来自多个表的数据时,我遇到了很多使用Zend框架数据库抽象类的问题。运行的查询数量和生成的所有对象的开销使我的托管服务器变成了膝盖。我已经恢复到编写查询来收集我的所有数据,然后散步数据来构建我的显示。它不像使用抽象层那样漂亮或OO,但它也不会让我的PHP脚本页面到磁盘,只是为了显示一个充满数据的表。

正如史蒂夫提到的基准无论你最终的解决方案,我还会分析你的内存使用情况。

+1

+1我同意,我为Zend Framework数据库类贡献了很多。这些问题适用于任何ORM;这不仅仅是Zend Framework。 – 2009-05-20 23:53:52

1

你可以使用Zend_ DB_表的关系特点处理这种情况。如果您目前正在为查询使用Zend_Db_Aadpter,则需要为会话,日期,课程等创建表包装类。

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

这是一个从你描述的单独查询每个数据集的做法也差不太多,但它给你检索相应的相关数据给定记录一个简单的OO接口。

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