使用Java或.Net 寫資料庫應用,很多人都用過Hibernate(或NHibernate)可以大大簡化資料庫編程,而以物件的方式來讀寫資料庫(ORM),Yii提供的Active Record (AR) 也是一個流行的物件-關係映射(ORM) 技術。每個 AR 類別代表一個資料表 (或視圖),資料表(或視圖)的列在 AR 類別中體現為類別的屬性,一個 AR 實例則表示表中的一行。 常見的 CRUD 操作作為 AR 的方法實作。因此,我們可以以一種更面向對象的方式存取資料。
這裡修改Yii Framework 開發教學(24) 資料庫-DAO 範例 ,看看使用Active Record如何讀取Employee表。
要存取一個資料表,我們首先需要透過整合 CActiveRecord 定義 一個 AR 類別。 每個 AR 類別代表一個單獨的資料表,一個 AR 實例則代表那個表中的一行。
由於 AR 類別經常在多處被引用 ,我們可以導入包含 AR 類別的整個目錄,而不是一個個導入。 例如,如果我們所有的AR 類別檔案都在protected/models 目錄中,我們可以設定應用如下:
'import'=>array( 'application.models.*', ),
本例定義Employee類別如下:
class Employee extends CActiveRecord { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'Employee'; } }
資料表行中所列的值可以作為對應AR 實例的屬性訪問。例如 $employee->EmployeeId 可以存取Employee的 EmployeeId欄位。
本例只是讀取Employee表,修改SiteController的indexAction方法:
public function actionIndex(){$model = Employee::model()->findAll(); $this->render('index', array('model' => $model, ));}
可以看到只要一行程式碼Employee::model()->findAll()就實作讀取資料庫表並賦值功能,來看看對應的顯示記錄的代碼:
{ echo 'EmployeeId:' . $employee->EmployeeId . '';echo 'First Name:' . $employee->FirstName . ''; echo 'Last Name:' . $employee->LastName . '';echo 'Title:' . $employee->Title . ''; echo 'Address:' . $employee->Address . '';echo 'Email:' . $employee->Email . ''; echo '----------------------';} ?>
可以看到使用AR可以透過資料庫表的欄位名稱(區分大小寫)直接存取某個欄位值,而無需在類別Employee定義,從而大大簡化程式碼。
在前面介紹Model時說過CModel有兩個子類,一個是FormModel,另外一個就是CActiveRecord, CActiveRecord定義了資料庫存取的CRUD方法,例如
建立記錄
要向資料表插入新行,我們要建立一個對應AR 類別的實例,設定其與表格的列相關的屬性,然後呼叫save() 方法完成插入
$employee=new Employee; $employee->FirstName='James'; $employee->LastName='Shen'; ... $employee->save();
如果表的主鍵是自增的,在插入完成後,AR 實例將包含一個更新的主鍵。如果一個列在表結 構中使用了靜態預設值(例如一個字串,一個數字)定義。
讀取記錄
要讀取數據表中的數據,我們可以通過如下方式調用find 系列方法中的一種
// 查找滿足指定條件的結果中的第一行
$post=Post: :model()->find($condition,$params);
// 找出有指定主鍵值的那一行
$post=Post::model()->findByPk($postID,$condition,$params) ;
// 尋找具有指定屬性值的行
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// 透過指定的SQL 語句找出結果中的第一行
$post=Post::model()->findBySql($sql,$params);如上圖所示,我們透過Post::model() 呼叫find 方法。 請記 住,靜態方法 model() 是每個 AR 類別所必須的。 此方法傳回在物件上下文中的一個用於存取類別層級方法(類似於靜態類別方法的 東西)的 AR 實例。
如果 find 方法找到了一個滿足查詢條件的行,它將傳回一個 Post 實例,實例的屬性含有資料表 行中對應列的值。 然後我們就可以像讀取普通物件的屬性一樣讀取載入的值,例如 echo $post->title;。
如果使用 給定的查詢條件在資料庫中沒有找到任何東西, find 方法將傳回 null 。
呼叫 find 時,我們使用 $condition 和 $params 指定查詢條件。此處 $condition 可以是 SQL 語句中的WHERE 字串,$params 則是一個參數數組,其中的值應綁定 到 $condation 中的佔位符。
更新記錄
在 AR 實例填充了列的值之後,我們可以改變它們並把它們存回資料表。
$post=Post::model()->findByPk(10); $post->title='new post title'; $post->save(); // 将更改保存到数据库删除记录
如果一個AR 實例被一行資料填充,我們也可以刪除此行資料
$post=Post::model()->findByPk(10); // 假设有一个帖子,其 ID 为 10 $post->delete(); // 从数据表中删除此行注意,删除之后, AR 实例仍然不变,但数据表中相应的行已经没了
其它可以參見Yii中文文件(http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar ),這裡不再詳細複述了。
本例顯示結果:
以上就是PHP開發框架Yii Framework教程(26) 資料庫-Active Record範例的內容,更多相關內容請關注PHP中文網(www.php.cn)!