DB_DataObject将数据表封装成对象,所有对数据库的操作转化为对象的操作。
使用DataObject,完全不用跟SQL打交道。特别在需要修改数据库结构的时候,例如增加或删除表和字段、改名、更改表间关系,在设计一个稍为复杂的系统时,这些情况都会经常出现。使用DataObject,只需修改很少的几个地方,不用去修改讨厌的SQL语句。再配合其它几个类,例如FormBuilder,DataGrid,就能够用很简单的几行代码实现数据输入和输出显示等复杂功能。
很多人使用DB类,因为DB类隐藏了不同数据库的差异。但是你还是要直接使用SQL语句。DataObject在DB的基础上进一步抽象,隐藏了数据库。
依赖关系
需要DB类的支持;DataObject_formBuilder依赖本类。
优点与缺点
面向对象操作数据库,提高开发效率,适应变化,适合于迭代式开发。执行效率略低。
快速开始
注意:由于Zend存在的一个bug,如果使用Zend,必须将 DataObject.php文件中第121行
define(‘DB_DATAOBJECT_NO_OVERLOAD’,true);
的注释符去掉;或在每个用到DataObject的文件的前面加上这句。原文还漏了“;”,记得加上。如果初次运行浏览器死锁或出现找不到页面,多半是这个问题。
在mysql中建立数据库
例如
CREATE TABLE IF NOT EXISTS `hr_employee` ( `id` smallint(5) unsigned NOT NULL auto_increment, `name` varchar(20) NOT NULL default '', `section_id` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`id`), ) TYPE=MyISAM COMMENT='员工表'; CREATE TABLE IF NOT EXISTS `hr_section` ( `id` tinyint(3) unsigned NOT NULL auto_increment, `name` varchar(20) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) TYPE=MyISAM COMMENT='部门表' ; CREATE TABLE IF NOT EXISTS `hr_project` ( `id` smallint(5) unsigned NOT NULL auto_increment, `name` varchar(60) NOT NULL default '', `date` date NOT NULL default '0000-00-00', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) TYPE=MyISAM COMMENT='项目表' ; CREATE TABLE IF NOT EXISTS `hr_employee_project` ( `id` int(11) unsigned NOT NULL auto_increment, `employee_id` smallint(5) unsigned NOT NULL default '0', `project_id` smallint(5) unsigned NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE KEY `employee_id` (`employee_id`,`project_id`) ) TYPE=MyISAM COMMENT='员工-项目表'; |
创建DataObject.ini
[DB_DataObject] database = mysql://user:password@server/database schema_location = /DataObjects class_location = /DataObjects require_prefix = /DataObjects/ |
创建 CreateDataObjectClasses.php
<?php //注意设置好你的pear包含路径 require_once 'd:/www/Pear/DB/DataObject/Generator.php'; $config = parse_ini_file("D:\www\hr\DataObjects\DataObject.ini", true); $options = &PEAR::getStaticProperty('DB_DataObject','options'); $options = $config['DB_DataObject']; if (!$options) { PEAR::raiseError("\n错误:无法读取ini文件\n\n", null, PEAR_ERROR_DIE); exit; } set_time_limit(0); DB_DataObject::debugLevel(1); $generator = new DB_DataObject_Generator; $generator->start(); ?> |
运行 CreateDataObjectClasses.php
在DataObjects目录中自动为数据库中每个表生一个 DataObject的子类,存为相应的php文件。
自动生成一个db.ini配置文件,db是你的数据库的名字。这个文件保存了每个表中各字段类型信息,用数字表示,是自动生成的,请不要修改这个表。
创建db.link.ini
[hr_employee] section_id = hr_section:id [hr_employee_project] employee_id = hr_employee:id project_id = hr_training_project:id [hr_project] id = hr_employee:id |
上述步骤看起来复杂,做好了一切就简单了。这可以我摸索了近半个月才搞清楚的。
现在可以开始了。
<? //取单个表的数据 $employee = new Hr_employee; $employee->name = '张三'; $employee->find(ture); echo '员工'.$employee->name.'的职务是'.$employee->position.', '; //取多对一关系的数据 $employee->getLinks(); echo '工作部门是'.$employee->_section_id->name.','; //取多对多关系的数据 echo '参加的项目包括'; $e_p = new Hr_employee_project; $e_p->employee_id = $employee->id; $e_p->find(); while ($e_p->fetch()) { $project = $e_p->getLink('project_id'); echo $project->name.'、'; } echo '。'; ?> |