http://jackyrong.iteye.com/blog/238930

http://www.oschina.net/project/tag/126/orm?sort=view&lang=22&os=0

java里有hibernate,php里有啥,这一直困绕着大家.最近发现了一个还可以的php的orm框架 ezpdo,
网站是http://www.ezpdo.net,有手册和帮助文件下载,今天看了下,现将其中一篇导学文大致翻译出来
(http://www.ezpdo.net/blog/2005/03/03/tutorial/),我是自己的话写出来的,不大喜欢一句句翻译
,供参考
   首先,当然是下载这玩意了,下载完之后,解压缩到一个目录,比如起名为ezpdo..要注意的是,
这个框架必须在mysql 4.1以上(支持主外键)和php 5.04以上的(PHP版本5以上,越新越好),
注意,在下面的例子中,是用mysql做数据库的,原文是用sqlite的,所以PHP5里,要配置好mysql,我今天试
的是mysql5的

我们讲解下examples\books这个项目,.在books子目录下,有两个子目录,分别是classes目录和complied目录,
其中classes 子目录是放类文件的,compiled目录是放ezpdo自己生成的文件,要求该目录要有写权限,而在
每个项目下,比如books的根目录下,有一个配置文件config.inc,里面是ezpdo的一些配置项,其中我们
要注意的是
  ; The default DSN to the database you want to store your objects
; This will be the default DSN for classes that do not have DSN specified
;default_dsn = sqlite://books.db
default_dsn = mysql://root:123456@localhost:3309/books
; default_dsn = pgsql://ezpdo_ex:pdoiseasy@localhost/ezpdo_ex
这里,我们用default_dsn指定了数据库连接串了,这里用的是MYSQL.,并且我们先建立了一个空的数据库
books.
   接下来我们设计实体类.这里以作者和其著作来说明,一个作者可以写多本书,一本书可以由多个
作者合写,构成典型的多对多关系了,先看一个基类
class Base {
    
    /**
     * tracking id (used by bookstore)
     * @var string
     * @orm char(64)
     */
    public $trackId;
    
    /**
     * Constructor
     */
    public function __construct() { 
        $this->trackId = uniqid('track-'); 
    } 
}
    
     这里没啥的,构造一个序列号而已,留意这里的注释了, @orm char(64),说明映射到数据库是string类型
,64位的,这有点象JAVA里JPA最新的anooatation的标记了,十分方便

接着是Author 类
  class Author extends Base {
    /**
     * Name of the author
     * @var string
     * @orm char(64)
     */
    public $name;
    
    /**
     * Books written by the author
     * @var array of Book
     * @orm has many Book
     */
    public $books = array();
    
    /**
     * Constructor
     * @param string $name author name
     */
    public function __construct($name = '') { 
        parent::__construct();
        $this->name = $name;
    }
 
    // the rest of the code in the class omitted... 
 
}
要留意的是$books是一个数组,因为一个作者有多本著作,而@orm has many Book则表明,一个作者
类关联到多个book类,而其中的关联等都不用我们搞了,也不象hibernate那样去设置.hbm配置文件了.
   再来看book类
class Book extends Base {

/**
     * Bool title
     * @var string
     * @orm title char(80)
     */
    public $title;
    
    /**
     * Number of pages
     * @var integer
     * @orm integer
     */
    public $pages = -1;
    
    /**
     * Book author (assuming many co-authors)
     * @var Author
     * @orm has many Author
     */
    public $authors = array();
 
    /**
     * Constructor
     * @param string
     */
    public function __construct($title = '') { 
parent::__construct();
        $this->title = $title;
    }
 
    // the rest of the code in the class omitted... 
}
   
   可以看到,book类和author类差不多,也通过@orm has many Author类进行设置了关联
  好了,接下来我们可以开始设置一个add.php的文件里,用来给数据库增加数据,在目录里是add.php文件
首先要把ezpdo的类库API包含进来
    include_once(dirname(__FILE__) . '/../../ezpdo_runtime.php');

// get the persistence manager (a singleton)
$m = epManager::instance();

这里获得持久管理器类的实例了,有点象hibernate的sessionfactory,接着
我们创建作者类的实例了
  // create authors
$a1 = $m->create('Author');
$a1->name = 'Erich Gamma';
 
$a2 = $m->create('Author');
$a2->name = 'Richard Helm';
 
$a3 = $m->create('Author');
$a3->name = 'Ralph Johnson';
 
$a4 = $m->create('Author');
$a4->name = 'John Vlissides';

我们创建了4个作者了
   如果你习惯了java的getter/setter,也可以这样
// setter 
$a1->setName('Erich Gamma');
// getter
echo $a1->getName();
  但是这不是必要的,因为在实体类里,你可以不必写getter/setter,ezpdoZ会帮你自动搞好,这点比hibernate要强些哦,
    接下来是书本类
// create books 
$b1 = $m->create('Book');
$b1->title = 'Design Patterns';
$b1->pages = 395;
 
$b2 = $m->create('Book');
$b2->title = 'Contributing to Eclipse: Principles, Patterns, and Plugins';
$b2->pages = 320;
   最后是把Author类和Books类关联起来
// add authors to books 
$b1->authors = array($a1, $a2, $a3, $a4);
$b2->authors = array($a1);
$b3->authors = array($a2);
$b4->authors = array($a3);
$b5->authors = array($a4);
 
// add books to authors 
$a1->books = array($b1, $b2);
$a2->books = array($b1, $b3);
$a3->books = array($b1, $b4);
$a4->books = array($b1, $b5);

最后,提交到数据库
$m->flush();(要注意的是,如果config.inc里设置了auto_flush,则不用写这句话了)
    如果我们运行add.php后,再运行print.php,可以看到数据库中的确建立了3个表,一个是books表,一个是
author表,另一个是自动生成的用来做多对多的关联表了.

要把对象状态提取出来,也很容易
// get the persistence manager
$m = epManager::instance();
 
// get all authors and books 
$authors = $m->get('Author');
$books = $m->get('Book');

查找对象也很容易,比如找Eric Gamma写的说,如下
// get the persistence manager
$m = epManager::instance();
 
// create the example object
$ea = $m->create('Author');
 
// set name to search
$ea->name = 'Erich Gamma'; 
 
// null variable is ignored in searching
// !!!important if the class constructor set non-null values!!!
$ea->trackId = null;
$ea->books = null;
 
// use the example object to find
if (!($as = $m->find($ea))) {
echo "Cannot find author [" . $ea->name . "]\n";
exit();
}
 
// go through each author and print
foreach($as as $a) {
echo $a; echo "\n";
}

甚至可以用象HIBERNATE中的HQL语句写,这里成了EZPDO SQL了,呵呵
// use EZOQL to find objects
$as = $m->query("from Author as author where author.name = 'Erich Gamma'");
if (!$as) {
echo "Cannot find author [Erich Gamma]\n";
exit();
}
 
// ...
   这次先说这么多,接下来继续研究

php里ezpdo orm框架初探的更多相关文章

  1. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  2. 自己写ORM框架 DBUtils_DG Java(C#的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  3. 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  4. C# 通过反射初探ORM框架的实现原理

    背景: 以前学的Java进行开发,多用到Mybatis,Hiberante等ORM框架,最近需要上手一个C#的项目,由于不是特别难,也不想再去学习C#的ORM框架,所以就想着用反射简单的实现一下ORM ...

  5. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  6. ORM之殇,我们需要什么样的ORM框架?

    最近在研究ORM,究竟什么样的框架才是我们想要的 开发框架的意义在于 开发更标准,更统一,不会因为不同人写的代码不一样 开发效率更高,无需重新造轮子,重复无用的代码,同时简化开发流程 运行效率得到控制 ...

  7. ORM框架示例及查询测试,上首页修改版(11种框架)

    继上次ORM之殇,我们需要什么样的ORM框架? 整理了11个ORM框架测试示例,通过示例代码和结果,能很容易了解各种框架的特性,优缺点,排名不分先后 EF PDF XCODE CRL NHiberna ...

  8. .Net开源微型ORM框架测评

    什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间 ...

  9. ORM框架详解

    .Net开源微型ORM框架测评 什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象 ...

随机推荐

  1. 关于控件的Invoke(...)方法和BeginInvoke(...)方法的区别

    这两个方法最主要的区别就是一个是同步,一个是异步,即会阻塞线程,那么阻塞哪个线程呢?我们用代码来分析(工具是VS2010) using System; using System.Collections ...

  2. LR性能指标分析

    Memory: ·Available Mbytes 简述:可用物理内存数.如果Available Mbytes的值很小(4 MB或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存. 参考值 ...

  3. 四则运算APP(BUG发掘)

    BUG: 1.有几率会出现一样的题目. 2.题目会出现两个一样的答案. 3.做题结束后不能返回主界面或者重新开始. 感想: 1.题目应该按年级分类出题. 2.主界面可以添加更多功能 如自己输入题目数, ...

  4. HDU 4122 Alice's mooncake shop --RMQ

    题意: 一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从 ...

  5. iOS文件存储路径规定

    Storing Your App’s Data Efficiently https://developer.apple.com/icloud/documentation/data-storage/in ...

  6. C#通过存储过程进行查询

    一直不确定C#可以通过存储过程进行查询,今天才确定是可以的. 可以返回DataReader或者Dataset.

  7. 关于Freelists和Freelist Groups的研究【转】

    一.       什么是freelists 本文在于探讨Freelists和Freelist Groups的作用,存取机制,争用诊断和优化方法,同时通过理论和测试来推翻一些存在了很久的错误观点.本文的 ...

  8. 多核模糊C均值聚类

    摘要: 针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生.本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现. 在这之前,我们已成功将核方法应用于FCM ...

  9. Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)

    题目链接:http://codeforces.com/contest/712/problem/D A初始有一个分数a,B初始有一个分数b,有t轮比赛,每次比赛都可以取[-k, k]之间的数,问你最后A ...

  10. SAP第一轮面试之英语群面

    很高兴通过了SAP的笔试,昨天进行了一轮面试.SAP一轮面试是英语群面(无领导小组讨论) 面试提前大约五天的样子通知面试时间地点,一般是在公司,要求正装.这些都会在HR联系你时通知的,所以不再啰嗦. ...