使用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 中的占位符。