Zend 框架的 MVC 数据设计问题

Posted

技术标签:

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

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

【问题讨论】:

“但作为任何有用的应用程序,我必须查询多个表”是什么意思。 【参考方案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 连接),并且它们是严格只读的。

【讨论】:

以上是关于Zend 框架的 MVC 数据设计问题的主要内容,如果未能解决你的问题,请参考以下文章

原创Zend Framework 2框架之MVC

原创Zend Framework 2框架之MVC

Ubuntu18.04下基于apache2部署Zend Framework 3 MVC框架含BUG/问题解决)

php Zend / MVC 没有 mod_rewrite

Zend Framework / MVC:将啥类型的对象推送到视图?

zend 框架显示/处理表单使用相同的动作/视图?