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 =