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 数据设计问题的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu18.04下基于apache2部署Zend Framework 3 MVC框架含BUG/问题解决)