使用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()就實現讀取資料庫表並賦值功能,來看看對應的顯示記錄 的代碼:
<?php foreach($model as $employee) { echo 'EmployeeId:' . $employee->EmployeeId . '<br />'; echo 'First Name:' . $employee->FirstName . '<br />'; echo 'Last Name:' . $employee->LastName . '<br />'; echo 'Title:' . $employee->Title . '<br />'; echo 'Address:' . $employee->Address . '<br />'; echo 'Email:' . $employee->Email . '<br />'; echo '---------------------- <br />'; } ?>
可以看到使用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 中的預留位置。