【问题标题】:MVC data design problem with Zend frameworkZend 框架的 MVC 数据设计问题
【发布时间】:2010-09-16 05:08:52
【问题描述】:

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

【问题讨论】:

  • “但作为任何有用的应用程序,我必须查询多个表”是什么意思。

标签: php database zend-framework


【解决方案1】:

您可以通过多种不同的方式实现这一目标,但是,您选择哪种方式实际上取决于您的具体情况。

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

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

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

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

那么你就有了两个班级(可能是每个桌子,但并非总是如此)

人 人物映射器

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

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

然后写传给mapper保存:

$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 连接客户信息,并且您是以只读方式进行的(所以您不需要t 想通过 Zend_DB_Table 适配器更新任何信息)你创建你的规范化表,然后在顶部有一个单一的视图。视图在幕后处理连接,因此通过 Zend 感觉就像您正在连接到单个表。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多