2

如果我有一个类表示以类:表关系访问我的数据库中的一个表,那么我可以在一个类中隐藏表的详细信息。但作为任何有用的应用程序,我必须查询几个表。我如何使用 class:table 设计来适应这一点?

4

1 回答 1

2

有几种不同的方法可以实现这一点,但是,您选择哪种方法实际上取决于您的情况。

1) 断开对象和数据库之间的连接

编写您的对象以与您的数据库表无关。首先规范化您的数据库表,然后查看应用程序的用户将如何与您的数据进行交互。将数据建模为对象,但不要将每个对象绑定到表(即使用 Zend_DB_Table_Abstract 类)

建立对象后,编写映射器类,将对象映射回数据库中的相关表。这些是扩展 Zend_DB_Table 的类(如果合适的话)。

您可以通过两种方式处理连接,或者通过 Zend_DB_Table 关系功能映射连接,或者,(恕我直言,更好的选择)只需使用 Zend_DB_Select 在您的映射器类中创建相关方法。

所以你有两个班级(可能是每张桌子,但并非总是如此)

人 PersonMapper

在您的代码中,当您想要使用某些对象时,可以创建一个新对象

$person = new Person();
$person->setName('andrew taylor');

然后将其写入映射器以保存它:

$personMapper = new PersonMapper();
$pesonnMapper->save($person);

或者,以另一种方式进行:

$personMapper = new PersonMapper();
$person = personMapper->load(29);

$person->setName('joe bloggs');
$personMapper->save($person);

从这里开始的下一步将是一个基于SPL的集合类:

$personList = $personMapper->loadAllMen();

foreach($personList AS $person) {

 echo $person->getName();
}

其中 $personMapper->loadAllMen() 是一个类似的方法:

$select = $this->select();
$select=>where('gender = "Male"');
$zendDbRows = this->fetchAll($select);

return new PersonList($zendDbRows);

2) MySQL 视图

如果您有很多连接表,其中每个连接只有一行,那么您将根据订单表中的 id 连接客户信息,并且您正在以只读方式进行操作(所以您不想通过 Zend_DB_Table 适配器更新任何信息)创建规范化表,然后在顶部创建一个视图。视图在幕后处理连接,因此通过 Zend 感觉就像您正在连接到单个表。

对此有一些警告,MySQL 视图确实存在一些性能问题(这就是为什么它最好用于单行 FK 连接),并且它们是严格只读的。

于 2008-10-09T13:43:37.087 回答