php裏ezpdo orm框架初探

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

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

 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();
}
 
// ...
   此次先說這麼多,接下來繼續研究
java

相關文章
相關標籤/搜索