程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP開發框架Yii Framework教程(26) 數據庫-Active Record示例

PHP開發框架Yii Framework教程(26) 數據庫-Active Record示例

編輯:PHP綜合

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved