使用ZF设计数据库抽象层
时间:2008-05-27 来源:剑心通明
本文包含一些怎样建立和使用数据层类的示例,数据层类基于Zend Framework的Zend_Db_Table类建立。
我们假设已经建立了一个数据库的表,名称为“users”。其包含了三个字段:id,这是表的主键;login,一个只允许使用字母的文本列;password,非空列。
我们向完成一个全功能的类迈出的第一步是实现Zend_Db_Table的一个简单的子类:
class Users extends Zend_Db_Table {
}
Zend的数据库对象映射过程通过将C语言风格的名称转换为camel/Pascal语言风格的名称的方式,将数据库的名称转换为类和属性的名称。例如,“users”表将映射为“Users”类,“users_login”字段映射为属性“usersLogin”。因此当建立Zend_Db_Table类的子类时,其将使用对应的名称自动关联到数据库对象。
但是,使用对象的直接映射可能会导致数据库和其他类之间的命名冲突。推荐在描述数据库对象时为每个类添加一个数据库前缀。换言之,只在一个特殊的命名空间中建立数据库类是较为妥善的做法。
Zend_Db_Table有一个特殊的类变量,称为“$_name”,它指明了相关联的数据表的名称。因此当新的数据库类被建立时,实际的表名称将被赋给此变量:
class DbUsers extends Zend_Db_Table {
protected $_name = 'users';
}
仅仅使用这个很简单的类就可以通过以下方式完成常见的数据库操作(例如插入、更新、删除):
建立新用户
// 建立数据对象
$users = new DbUsers(); // 建立一条新记录——Zend_Db_Row类的一个对象
$user = $users->fetchNew();
// 为新记录的字段赋值
$user->login = 'Alexander';
$user->password = '*****';
// 存入数据库
$user->save();
选择id=10的用户并修改用户的密码
// 取得一条记录——Zend_Db_Row类的一个对象
$user = $users->find(10);
// 修改用户的密码
$user->password = '*****';
$user->save();
通常,数据层类在将数据记录发送到数据库之前对其进行校验。为此我们将为更新操作添加一些验证代码并定义异常的特殊类型,这将指明验证的错误所在。在DBMS中我们将为表的更新操作添加个触发器。
// 定义一个异常
class InvalidDbDataException extends Exception
{} // 更新操作带有触发器的DbUsers类
class DbUsers extends Zend_Db_Table {
protected $_name = 'users';
// 当向数数据库中存储记录时执行此函数
function update($params, $where)
{
// 校验密码列,当为空时抛出InvalidDbDataException异常
if ('' == $params['password']) {
throw new InvalidDbDataException('The password field cannot be empty');
}
return parent::update($params, $where);
}
}
// 取得数据,用空值替换password字段的值并保存记录
$user = $users->find(2);
$row->password = '';
// 取得在保存过程中抛出的异常,并显示其信息
try {
$row->save();
} catch (InvalidDbDataException $e) {
echo 'Updating fialed. Reason: ' . $e->getMessage();
}
我们假设已经建立了一个数据库的表,名称为“users”。其包含了三个字段:id,这是表的主键;login,一个只允许使用字母的文本列;password,非空列。
我们向完成一个全功能的类迈出的第一步是实现Zend_Db_Table的一个简单的子类:
class Users extends Zend_Db_Table {
}
Zend的数据库对象映射过程通过将C语言风格的名称转换为camel/Pascal语言风格的名称的方式,将数据库的名称转换为类和属性的名称。例如,“users”表将映射为“Users”类,“users_login”字段映射为属性“usersLogin”。因此当建立Zend_Db_Table类的子类时,其将使用对应的名称自动关联到数据库对象。
但是,使用对象的直接映射可能会导致数据库和其他类之间的命名冲突。推荐在描述数据库对象时为每个类添加一个数据库前缀。换言之,只在一个特殊的命名空间中建立数据库类是较为妥善的做法。
Zend_Db_Table有一个特殊的类变量,称为“$_name”,它指明了相关联的数据表的名称。因此当新的数据库类被建立时,实际的表名称将被赋给此变量:
class DbUsers extends Zend_Db_Table {
protected $_name = 'users';
}
仅仅使用这个很简单的类就可以通过以下方式完成常见的数据库操作(例如插入、更新、删除):
建立新用户
// 建立数据对象
$users = new DbUsers(); // 建立一条新记录——Zend_Db_Row类的一个对象
$user = $users->fetchNew();
// 为新记录的字段赋值
$user->login = 'Alexander';
$user->password = '*****';
// 存入数据库
$user->save();
选择id=10的用户并修改用户的密码
// 取得一条记录——Zend_Db_Row类的一个对象
$user = $users->find(10);
// 修改用户的密码
$user->password = '*****';
$user->save();
通常,数据层类在将数据记录发送到数据库之前对其进行校验。为此我们将为更新操作添加一些验证代码并定义异常的特殊类型,这将指明验证的错误所在。在DBMS中我们将为表的更新操作添加个触发器。
// 定义一个异常
class InvalidDbDataException extends Exception
{} // 更新操作带有触发器的DbUsers类
class DbUsers extends Zend_Db_Table {
protected $_name = 'users';
// 当向数数据库中存储记录时执行此函数
function update($params, $where)
{
// 校验密码列,当为空时抛出InvalidDbDataException异常
if ('' == $params['password']) {
throw new InvalidDbDataException('The password field cannot be empty');
}
return parent::update($params, $where);
}
}
// 取得数据,用空值替换password字段的值并保存记录
$user = $users->find(2);
$row->password = '';
// 取得在保存过程中抛出的异常,并显示其信息
try {
$row->save();
} catch (InvalidDbDataException $e) {
echo 'Updating fialed. Reason: ' . $e->getMessage();
}
相关阅读 更多 +