首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Yii Framework 教程 (23):資料庫存取總覽 - DAO、Query Builder、ActiveRecord 三層抽象

     編輯:PHP 綜合知識

Yii 資料庫存取架構

Yii 提供三層抽象,滿足不同複雜度與控制需求:

  1. DAO (Data Access Object):薄封裝 PDO,直接執行 SQL,效能最高、控制最精細。
  2. Query Builder:流式介面構建 SQL,程式化建構查詢、自動引用表/欄位名、參數綁定防注入。
  3. ActiveRecord (AR):完整 ORM,表對應類、行對應實例、關聯導航、驗證、生命週期事件,開發效率最高。

支援的資料庫系統 (透過 PDO 驅動)

  • MySQL、MariaDB、PostgreSQL、SQLite、SQL Server、Oracle、DB2、Firebird、Cubrid、Informix 等。
  • 本教程以 MySQL + Chinook 範例資料庫示範 (亦支援 Northwind)。

Chinook 資料模型 ER 圖

資料庫連線配置 (protected/config/main.php)


'components' => [
    'db' => [
        'class' => 'CDbConnection',
        'connectionString' => 'mysql:host=localhost;dbname=chinook',
        'username' => 'root',
        'password' => 'password',
        'emulatePrepare' => true,  // MySQL 必須,模擬預備語句
        'charset' => 'utf8',
        'tablePrefix' => 'tbl_',   // 可選表前綴
        'enableProfiling' => true, // 開啟 SQL 分析
        'schemaCachingDuration' => 3600, // 生產環境快取 Schema
    ],
],

存取連線:Yii::app()->db (單例,自動連線)。

三層抽象對比表

維度DAOQuery BuilderActiveRecord
程式碼風格原生 SQL 字串流式 PHP 方法鏈物件導向屬性/方法
SQL 控制權完全控制高度控制自動生成 (可覆寫)
防注入手動參數綁定自動參數綁定自動參數綁定
關聯查詢手寫 JOINjoin() 方法relations() 定義後透明導航
資料驗證無無內建 rules()、beforeSave()
效能最高 (無額外開銷)極低開銷較高開銷 (物件實例化、關聯載入)
適用場景複雜報表、批次操作、舊系統遷移動態查詢條件、部分欄位、無 AR 模型標準 CRUD、業務邏輯封裝、快速開發

核心類別速查

DAO 四大類

  • CDbConnection:資料庫連線管理、交易控制 (beginTransaction()/commit()/rollBack())、Schema 獲取。
  • CDbCommand:SQL 執行主體,execute() (非查詢)、query()/queryAll()/queryRow()/queryScalar()/queryColumn()。
  • CDbDataReader:前向唯讀游標,read() 逐行迭代,記憶體友善。
  • CDbTransaction:交易物件,支援嵌套交易 (savepoint)。

Query Builder 主要方法


$command = Yii::app()->db->createCommand();
$command->select('id, title')
        ->from('tbl_post')
        ->join('tbl_user', 'author_id=user.id')
        ->where('status=:status', [':status'=>1])
        ->order('create_time DESC')
        ->limit(10)
        ->offset(0);
$rows = $command->queryAll(); // 陣列集合

ActiveRecord 基礎定義


class Post extends CActiveRecord {
    public static function model($className=__CLASS__) { return parent::model($className); }
    public function tableName() { return 'tbl_post'; }
    public function relations() {
        return [
            'author' => [self::BELONGS_TO, 'User', 'author_id'],
            'comments' => [self::HAS_MANY, 'Comment', 'post_id'],
            'tags' => [self::MANY_MANY, 'Tag', 'tbl_post_tag(post_id, tag_id)'],
        ];
    }
    public function rules() { /* 驗證規則 */ }
}

最佳實踐建議

  1. 預設使用 ActiveRecord:90% 業務邏輯足夠,可讀性、維護性最佳。
  2. 複雜報表/統計用 Query Builder:避免載入大量 AR 實例,僅選取必要欄位。
  3. 極致效能/批次處理用 DAO:CDbCommand::execute() 批次 INSERT/UPDATE、CDbDataReader 流式處理百萬行。
  4. 混合使用:同一專案、甚至同一 Controller 可同時使用三層,互不衝突。
  5. 關閉生產環境 Schema 快取:'schemaCachingDuration' => 3600,避免每請求讀取資料庫元數據。

下一章預告

(24) DAO 範例:建立連線、執行 SQL、交易控制、CDbDataReader 流式讀取完整代碼演示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved