PEAR DB_DataObject 简介


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 '。'; 
?>

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据