首頁  >  文章  >  後端開發  >  PHP開發框架Yii Framework教學(26) 資料庫-Active Record範例

PHP開發框架Yii Framework教學(26) 資料庫-Active Record範例

黄舟
黄舟原創
2017-01-22 09:27:501688瀏覽

使用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開發框架Yii Framework教程(26) 資料庫-Active Record範例的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn