gpt4 book ai didi

php - Zend框架的MVC数据设计问题

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:12 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

所以你有两个类(可能每个表,但不总是)

人人物映射器

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

$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 View

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

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

关于php - Zend框架的MVC数据设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/186142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com