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

'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 (單例,自動連線)。
| 維度 | DAO | Query Builder | ActiveRecord |
|---|---|---|---|
| 程式碼風格 | 原生 SQL 字串 | 流式 PHP 方法鏈 | 物件導向屬性/方法 |
| SQL 控制權 | 完全控制 | 高度控制 | 自動生成 (可覆寫) |
| 防注入 | 手動參數綁定 | 自動參數綁定 | 自動參數綁定 |
| 關聯查詢 | 手寫 JOIN | join() 方法 | relations() 定義後透明導航 |
| 資料驗證 | 無 | 無 | 內建 rules()、beforeSave() |
| 效能 | 最高 (無額外開銷) | 極低開銷 | 較高開銷 (物件實例化、關聯載入) |
| 適用場景 | 複雜報表、批次操作、舊系統遷移 | 動態查詢條件、部分欄位、無 AR 模型 | 標準 CRUD、業務邏輯封裝、快速開發 |
CDbConnection:資料庫連線管理、交易控制 (beginTransaction()/commit()/rollBack())、Schema 獲取。CDbCommand:SQL 執行主體,execute() (非查詢)、query()/queryAll()/queryRow()/queryScalar()/queryColumn()。CDbDataReader:前向唯讀游標,read() 逐行迭代,記憶體友善。CDbTransaction:交易物件,支援嵌套交易 (savepoint)。
$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(); // 陣列集合
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() { /* 驗證規則 */ }
}
CDbCommand::execute() 批次 INSERT/UPDATE、CDbDataReader 流式處理百萬行。'schemaCachingDuration' => 3600,避免每請求讀取資料庫元數據。(24) DAO 範例:建立連線、執行 SQL、交易控制、CDbDataReader 流式讀取完整代碼演示。