PHP開發架構Yii Framework教程(26) 資料庫-Active Record樣本

來源:互聯網
上載者:User

使用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 中的預留位置。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.