Extended Question: Why should I use data mapper / Db_Table_Row, where as DbTable is capable of handling most of the basic tasks for data manipulation.

我目前正在学习ZF v1.11

对于数据库操作,我 for each 表创建了DbTable.例如,"用户"表由应用程序_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();

我的问题是,何时需要定义行类(假设在ZF教程中将Table_Row称为DataMapper)

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

for each 实体创建一个Row类有什么好处?有谁能告诉我这方面的最佳实践吗.

推荐答案

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

For example在USERS表的情况下,您可以在自定义用户行中定义一个名为getFullName()的方法,如下所示:

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

然后,在获取用户行对象时,要获取用户的全名,只需执行以下操作:

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

Second example是当USERS表有一些父表时,比如Addresses.在本例中,您可以在用户行中定义一个名为getAddress的方法:

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

在此方案中,您将获得当前用户的地址行对象,如下所示:

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

Another example,当您想要创建自定义的delete或insert方法时.假设您不想使用delete()方法删除管理员用户.然后您可以从Zend_Db_Table_行重载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

这只是三个基本示例,展示了定义您自己的行类的有效性.但它们当然不是必须的.然而,从我自己的经验来看,它们相当方便.

Database相关问答推荐

Kusto:从一个表中复制行并追加到同一集群中的另一个表中

KUST查询指定时间跨度内里程表&值的差值,并将其滚动到0

Spring DriverManagerDataSource vs apache BasicDataSource

Android SQLiteno such table异常

在 MySQL 中创建表时如何定义列的默认值?

PostgreSQL 是否对只读事务进行了一些性能优化

寻找基于磁盘的类 redis 数据库

如何在 Play 2.0 中 for each 环境设置不同的数据库?

为什么数据库索引使用平衡树,而不是哈希表?

在数据库中存储枚举值的最佳方式 - String 或 Int

文件访问速度与数据库访问速度

为什么在 Hibernate 中不推荐hibernate.connection.autocommit = true?

customer客户表的数据库 struct ,每个客户有很多订单,每个订单有很多商品

使用 C3P0 的 JDBC 连接池

Android SQLite 数据库,为什么要删除表并在升级时重新创建

Firebase 排行榜排名

数据库 EAV 优点/缺点和替代方案

数据库 - (行或记录、列或字段)?

我应该标准化我的数据库吗?

数据库索引及其 Big-O 表示法