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

Yii 2 核心組件詳解:DAO 數據訪問對象完整指南

     編輯:PHP 相關知識

Yii 2 核心組件詳解:DAO 數據訪問對象完整指南

Yii DAO 建立在 PDO 之上,提供統一 API 訪問多種數據庫(MySQL、PostgreSQL、SQLite 等),實現數據庫無關的應用開發。本文系統講解連接管理、SQL 執行、事務處理、參數綁定、表前綴等核心用法。

核心類架構

類職責
CDbConnection數據庫連接管理
CDbCommandSQL 語句構建與執行
CDbDataReader只前游標讀取結果集
CDbTransaction事務控制

1. 建立數據庫連接

獨立使用

$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)。

常用 DSN 格式

  • SQLite: sqlite:/path/to/dbfile
  • MySQL: mysql:host=localhost;dbname=testdb
  • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
  • SQL Server: mssql:host=localhost;dbname=testdb
  • Oracle: oci:dbname=//localhost:1521/testdb

2. 執行 SQL 語句

$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(); // 第一行第一列 (標量)

3. 遍歷結果集

$reader = $cmd->query();
// 方式 1: read() 循環
while (($row = $reader->read()) !== false) { /* ... */ }

// 方式 2: foreach 迭代
foreach ($reader as $row) { /* ... */ }

// 方式 3: 一次性取出所有
$rows = $reader->readAll();

4. 事務處理

$transaction = $conn->beginTransaction();
try {
    $conn->createCommand($sql1)->execute();
    $conn->createCommand($sql2)->execute();
    // ... 其他 SQL
    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollBack();
}

5. 參數綁定(防注入、提升性能)

$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() 避免重複內存拷貝
  • 無需手動加引號,驅動層自動處理

6. 列綁定(結果集映射到變量)

$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";
}

7. 表前綴支持 (v1.1.0+)

配置 CDbConnection::tablePrefix = 'tbl_',SQL 中用 {{TableName}} 表示帶前綴的表:

// 實際操作 tbl_user 表
$sql = 'SELECT * FROM {{user}}';
$users = $conn->createCommand($sql)->queryAll();

適用於多應用共享數據庫、單元測試隔離等場景。

最佳實踐提示

  • 優先使用 queryAll()/queryRow() 等便捷方法,代碼更簡潔
  • 所有用戶輸入進 SQL **必須** 參數綁定,杜絕拼接字符串
  • 事務包裹邏輯單元,異常時自動回滾保證一致性
  • 長連接場景注意 CDbConnection::autoConnect 與連接池配合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved