php - Zend 框架——我为什么要使用数据映射器/Db_Table_Row?

标签 php database design-patterns zend-framework zend-db-table

扩展问题:为什么我应该使用数据映射器/Db_Table_Row,因为 DbTable 能够处理数据操作的大部分基本任务。

我目前正在学习ZF v1.11

对于数据库操作,我为每个表创建了 DbTable。例如,“用户”表由 Application_Model_DbTable_Users 表示,其中没有其他代码。

当操作数据时,我可以使用:

<?php
$uTable = new Application_Model_DbTable_Users();
$newUid = $uTable->insert(array('name'=>'Old Name', 'email'=>''));
$user = $uTable->find($newUid)->current();

// Then I can use $user which is instance of Table_Row
$user->name = "New Name";
$user->email = "email@addr.com";
$user->save();

我的问题是,我什么时候需要定义一个行类(假设 Table_Row 在 ZF-Tutorials 中被称为 DataMapper)

// By, adding this to the DbTable class
protected $_rowClass = 'Application_Model_User';

为每个实体设置一个 Row 类有什么好处?谁能给我指出这方面的最佳做法。

最佳答案

您不需要定义自己的 Table_Row。但是,它在许多情况下可能很有用,特别是如果您想为给定的用户行定义一些特定的方法或属性。它们还可以提高代码的可读性。

例如在您的用户表案例中,您可以在自定义用户行中定义一个名为 getFullName() 的方法:

public function getFullName() {
    return $this->firstName . ' ' . $this->lastName;
}

那么当你获取用户行对象时,要获取用户的全名,你就这样做:

$user = $uTable->find($newUid)->current();
$fullName = $user->getFullName();

第二个例子是当您有一些父表到用户表时,例如地址。在这种情况下,您可以在用户行中定义一个名为 getAddress 的方法:

public function getAddress() {
    return $this->findParentRow('Application_Model_DbTable_Addresses');
}

在这种情况下,您将获得当前用户的地址行对象,如下所示:

$user = $uTable->find($newUid)->current();
$addressRow = $user->getAddress();

另一个例子,当您想要创建自定义删除或插入方法时。假设您要确保不想使用 delete() 方法删除管理员用户。然后你可以重载 Zend_Db_Table_Row 中的 delete 方法,如下所示:

public function delete() {
        if ('admin' === $this->userRole) {
              return 0;
        }
        return parent::delete();
} 

这样,您将无法仅通过在用户行对象上调用 delete() 来删除管理员用户:

 $user = $uTable->find($newUid)->current();
 $rowsDeleted = $user->delete(); // would be 0 if $user is admin

这只是三个基本示例,展示了定义自己的行类的有用性。但当然它们不是必需的。但是,根据我自己的经验,它们非常方便。

关于php - Zend 框架——我为什么要使用数据映射器/Db_Table_Row?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843676/

相关文章:

php - 使用 XPath 搜索和打印 XML

mysql - 无法弄清楚为什么我的一些 SQL 代码不起作用

database - 数据集——我在哪里可以找到关于不同汽车实例的原始价格/零售值(value)的数据集?

java - 在 ElasticSearch 中存储 News Feed 的最佳设计模式

php - 如何在php中对查询结果进行排序?

php - 包中的 Laravel 5.2 数据库种子?

php - Apache2 不记录错误

android - 房间 android 数据库被锁定

java - 仅允许某些类构造另一个类的模式的名称

design-patterns - 整洁的架构 UseCases 与具有功能的 Controller