Yii DAO 建立在 PDO 之上,提供統一 API 訪問多種數據庫(MySQL、PostgreSQL、SQLite 等),實現數據庫無關的應用開發。本文系統講解連接管理、SQL 執行、事務處理、參數綁定、表前綴等核心用法。
| 類 | 職責 |
|---|---|
CDbConnection | 數據庫連接管理 |
CDbCommand | SQL 語句構建與執行 |
CDbDataReader | 只前游標讀取結果集 |
CDbTransaction | 事務控制 |
$dsn = 'mysql:host=localhost;dbname=testdb'; $conn = new CDbConnection($dsn, 'username', 'password'); $conn->active = true; // 打開連接 // ... 操作 $conn->active = false; // 關閉連接
protected/config/main.php)'components' => array(
'db' => array(
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=testdb',
'username' => 'root',
'password' => 'password',
'emulatePrepare' => true, // 部分 MySQL 環境需要
),
),
之後全局通過 Yii::app()->db 獲取單例連接(自動激活,除非設定 autoConnect=false)。
sqlite:/path/to/dbfilemysql:host=localhost;dbname=testdbpgsql:host=localhost;port=5432;dbname=testdbmssql:host=localhost;dbname=testdboci:dbname=//localhost:1521/testdb$conn = Yii::app()->db; $cmd = $conn->createCommand($sql); // 創建命令對象 // 非查詢:INSERT/UPDATE/DELETE,返回影響行數 $affected = $cmd->execute(); // 查詢:返回 CDbDataReader $reader = $cmd->query(); // 便捷查詢方法 $rows = $cmd->queryAll(); // 所有行 (二維數組) $row = $cmd->queryRow(); // 第一行 (關聯數組) $col = $cmd->queryColumn(); // 第一列 (一維數組) $val = $cmd->queryScalar(); // 第一行第一列 (標量)
$reader = $cmd->query();
// 方式 1: read() 循環
while (($row = $reader->read()) !== false) { /* ... */ }
// 方式 2: foreach 迭代
foreach ($reader as $row) { /* ... */ }
// 方式 3: 一次性取出所有
$rows = $reader->readAll();
$transaction = $conn->beginTransaction();
try {
$conn->createCommand($sql1)->execute();
$conn->createCommand($sql2)->execute();
// ... 其他 SQL
$transaction->commit();
} catch (Exception $e) {
$transaction->rollBack();
}
$sql = 'INSERT INTO tbl_user (username, email) VALUES (:username, :email)';
$cmd = $conn->createCommand($sql);
// 綁定參數 (引用變量,適合循環批量)
$cmd->bindParam(':username', $username, PDO::PARAM_STR);
$cmd->bindParam(':email', $email, PDO::PARAM_STR);
$cmd->execute();
// 換一組數據再次執行
$cmd->bindParam(':username', $username2, PDO::PARAM_STR);
$cmd->bindParam(':email', $email2, PDO::PARAM_STR);
$cmd->execute();
bindParam() 綁定變量引用;bindValue() 綁定具體值bindParam() 避免重複內存拷貝$sql = 'SELECT username, email FROM tbl_user';
$reader = $conn->createCommand($sql)->query();
$reader->bindColumn(1, $username); // 第 1 列 -> $username
$reader->bindColumn(2, $email); // 第 2 列 -> $email
while ($reader->read() !== false) {
// $username, $email 自動更新為當前行值
echo "$username <$email>\n";
}
配置 CDbConnection::tablePrefix = 'tbl_',SQL 中用 {{TableName}} 表示帶前綴的表:
// 實際操作 tbl_user 表
$sql = 'SELECT * FROM {{user}}';
$users = $conn->createCommand($sql)->queryAll();
適用於多應用共享數據庫、單元測試隔離等場景。
queryAll()/queryRow() 等便捷方法,代碼更簡潔CDbConnection::autoConnect 與連接池配合