面向对象的多表查询表示

时间:2010-08-24 11:21:08

标签: php database zend-framework orm zend-db

假设我们有两个相关的表,例如一个表示一个人:

PERSON

  • 名称
  • 年龄
  • ...
  • current_status_id

和一个代表此人在特定时间更新的状态:

STATUS_HISTORY

  • recorded_on
  • STATUS_ID
  • blood_pressure
  • 长度
  • ...

我使用Zend Framework在PHP中构建了一个应用程序,并试图通过使用一个类来表示一个人和一个用于表示一个人状态的类来保留“面向对象”。我还尝试尽可能使用ORM原则,例如使用数据映射器将域模型与数据层分离。

从数据映射器返回人员列表的好方法(和面向对象)是什么?在列表中我有时想知道人的最后测量的血压,有时不知道(取决于要求)使用列表的报告/视图的位置)。对于不同的领域也是如此,例如在数据层计算的值(总和,计数等)。

我的第一个想法是使用行集(例如Zend_Db_Rowset),但这引入了我的视图和数据层之间的高耦合。另一种方法可能是返回一个人员列表,然后使用数据映射器查询每个人的最新状态,以请求特定人员的状态。但是,这将导致(至少)对每个人记录进行一次额外查询,并且不允许我在数据层使用JOINS。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

由于我工作的ORM,我们也有同样的问题。如果你对首先得到你的人员名单的表现感到担心,然后单独查询他们的状态,你真的别无选择,只能稍微结合你的数据。

在我看来,这没关系。您可以创建一个包含“person”数据的类和一个包含“status_history”记录的数组,也可以创建每个“person”进行另一个查询的性能。您可以通过在本地执行数据缓存来减少查询开销(您的控制器必须确定如果在某个时间阈值之前发出一组数据请求,它只返回自己的数据而不是查询数据库服务器)

拥有纯粹的OO视图很不错,但有时候是不切实际的。

答案 1 :(得分:0)

尝试使用PHP的inbuild类的“stdclass”类,您可以获取将由PHP自动创建的stdclass对象,其成员变量将是列名。所以你可以获取对象并按列名获取值。例如。

查询

从DEPT a,EMP b中选择a.dept_id,a.dept_name,a.e_id,b.emp_name,b.emp_id,其中b.emp_id = a.e_id;

结果将是stdclass对象的数组。每行代表一个stdclass对象。

对象

stdClass的 {    的dept_id;    DEPT_NAME;    E_ID;    EMP_ID;    EMP_NAME; }

您可以像访问一样访问 foreach($ resultset as $ row) {    $ d_id = $ row-> dept_id;    $ d_nam = $ row-> dept_name;    $ e_id = $ row-> e_id;    $ em_id = $ row-> emp_id;    $ e_nam = $ row-> emp_name; }

但是

  

Blockquote

我不确定表现。