開始使用數(shù)據(jù)庫首先需要配置數(shù)據(jù)庫連接組件,通過添加 db 組件到應(yīng)用配置實現(xiàn)("基礎(chǔ)的" Web 應(yīng)用是 config/web.php),,DSN( Data Source Name )是數(shù)據(jù)源名稱,用于指定數(shù)據(jù)庫信息.如下所示:
return [ // ... 'components' => [ // ... 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=mydatabase', // MySQL, MariaDB //'dsn' => 'sqlite:/path/to/database/file', // SQLite //'dsn' => 'pgsql:host=localhost;port=5432;dbname=mydatabase', // PostgreSQL //'dsn' => 'cubrid:dbname=demodb;host=localhost;port=33000', // CUBRID //'dsn' => 'sqlsrv:Server=localhost;Database=mydatabase', // MS SQL Server, sqlsrv driver //'dsn' => 'dblib:host=localhost;dbname=mydatabase', // MS SQL Server, dblib driver //'dsn' => 'mssql:host=localhost;dbname=mydatabase', // MS SQL Server, mssql driver //'dsn' => 'oci:dbname=//localhost:1521/mydatabase', // Oracle 'username' => 'root', //數(shù)據(jù)庫用戶名 'password' => '', //數(shù)據(jù)庫密碼 'charset' => 'utf8', ], ], // ... ]; 請參考PHP manual獲取更多有關(guān) DSN 格式信息,。 配置連接組件后可以使用以下語法訪問:
請參考
注意:如果需要同時使用多個數(shù)據(jù)庫可以定義 多個 連接組件: return [ // ... 'components' => [ // ... 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=mydatabase', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], 'secondDb' => [ 'class' => 'yii\db\Connection', 'dsn' => 'sqlite:/path/to/database/file', ], ], // ... ]; 在代碼中通過以下方式使用:
如果不想定義數(shù)據(jù)庫連接為全局應(yīng)用組件,,可以在代碼中直接初始化使用:
SQL 基礎(chǔ)查詢一旦有了連接實例就可以通過[[yii\db\Command]]執(zhí)行 SQL 查詢。 SELECT 查詢查詢返回多行:
返回單行:
查詢多行單值:
查詢標(biāo)量值/計算值:
UPDATE, INSERT, DELETE 更新,、插入和刪除等如果執(zhí)行 SQL 不返回任何數(shù)據(jù)可使用命令中的 execute 方法:
你可以使用 // INSERT $connection->createCommand()->insert('user', [ 'name' => 'Sam', 'age' => 30, ])->execute(); // INSERT 一次插入多行 $connection->createCommand()->batchInsert('user', ['name', 'age'], [ ['Tom', 30], ['Jane', 20], ['Linda', 25], ])->execute(); // UPDATE $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execute(); // DELETE $connection->createCommand()->delete('user', 'status = 0')->execute(); 引用的表名和列名大多數(shù)時間都使用以下語法來安全地引用表名和列名: $sql = "SELECT COUNT([[$column]]) FROM {{table}}"; $rowCount = $connection->createCommand($sql)->queryScalar(); 以上代碼 $sql = "SELECT COUNT([[$column]]) FROM {{%$table}}"; $rowCount = $connection->createCommand($sql)->queryScalar(); 如果在配置文件如下設(shè)置了表前綴,,以上代碼將在 tbl_table 這個表查詢結(jié)果: return [ // ... 'components' => [ // ... 'db' => [ // ... 'tablePrefix' => 'tbl_', ], ], ]; 手工引用表名和列名的另一個選擇是使用[[yii\db\Connection::quoteTableName()]] 和 [[yii\db\Connection::quoteColumnName()]]: $column = $connection->quoteColumnName($column); $table = $connection->quoteTableName($table); $sql = "SELECT COUNT($column) FROM $table"; $rowCount = $connection->createCommand($sql)->queryScalar(); 預(yù)處理語句為安全傳遞查詢參數(shù)可以使用預(yù)處理語句,首先應(yīng)當(dāng)使用 $command = $connection->createCommand('SELECT * FROM post WHERE id=:id'); $command->bindValue(':id', $_GET['id']); $post = $command->query(); 另一種用法是準(zhǔn)備一次預(yù)處理語句而執(zhí)行多次查詢: $command = $connection->createCommand('DELETE FROM post WHERE id=:id'); $command->bindParam(':id', $id); $id = 1; $command->execute(); $id = 2; $command->execute();
事務(wù)當(dāng)你需要順序執(zhí)行多個相關(guān)的的 $transaction = $connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); // ... 執(zhí)行其他 SQL 語句 ... $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); } 我們通過[[yii\db\Connection::beginTransaction()|beginTransaction()]]開始一個事務(wù),通過 如需要也可以嵌套多個事務(wù): // 外部事務(wù) $transaction1 = $connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); // 內(nèi)部事務(wù) $transaction2 = $connection->beginTransaction(); try { $connection->createCommand($sql2)->execute(); $transaction2->commit(); } catch (Exception $e) { $transaction2->rollBack(); } $transaction1->commit(); } catch (Exception $e) { $transaction1->rollBack(); }
Yii 也支持為事務(wù)設(shè)置隔離級別
你可以使用以上常量或者使用一個string字符串命令,,在對應(yīng)數(shù)據(jù)庫中執(zhí)行該命令用以設(shè)置隔離級別,比如對于
關(guān)于隔離級別[isolation levels]: http://en./wiki/Isolation_%28database_systems%29#Isolation_levels 數(shù)據(jù)庫復(fù)制和讀寫分離很多數(shù)據(jù)庫支持?jǐn)?shù)據(jù)庫復(fù)制 database replication來提高可用性和響應(yīng)速度. 在數(shù)據(jù)庫復(fù)制中,,數(shù)據(jù)總是從主服務(wù)器 到 從服務(wù)器. 所有的插入和更新等寫操作在主服務(wù)器執(zhí)行,,而讀操作在從服務(wù)器執(zhí)行. 通過配置[[yii\db\Connection]]可以實現(xiàn)數(shù)據(jù)庫復(fù)制和讀寫分離. [ 'class' => 'yii\db\Connection', // 配置主服務(wù)器 'dsn' => 'dsn for master server', 'username' => 'master', 'password' => '', // 配置從服務(wù)器 'slaveConfig' => [ 'username' => 'slave', 'password' => '', 'attributes' => [ // use a smaller connection timeout PDO::ATTR_TIMEOUT => 10, ], ], // 配置從服務(wù)器組 'slaves' => [ ['dsn' => 'dsn for slave server 1'], ['dsn' => 'dsn for slave server 2'], ['dsn' => 'dsn for slave server 3'], ['dsn' => 'dsn for slave server 4'], ], ] 以上的配置實現(xiàn)了一主多從的結(jié)構(gòu),從服務(wù)器用以執(zhí)行讀查詢,,主服務(wù)器執(zhí)行寫入查詢,,讀寫分離的功能由后臺代碼自動完成.調(diào)用者無須關(guān)心.例如: // 使用以上配置創(chuàng)建數(shù)據(jù)庫連接對象 $db = Yii::createObject($config); // 通過從服務(wù)器執(zhí)行查詢操作 $rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); // 通過主服務(wù)器執(zhí)行更新操作 $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
你也可以配置多主多從的結(jié)構(gòu),例如: [ 'class' => 'yii\db\Connection', // 配置主服務(wù)器 'masterConfig' => [ 'username' => 'master', 'password' => '', 'attributes' => [ // use a smaller connection timeout PDO::ATTR_TIMEOUT => 10, ], ], // 配置主服務(wù)器組 'masters' => [ ['dsn' => 'dsn for master server 1'], ['dsn' => 'dsn for master server 2'], ], // 配置從服務(wù)器 'slaveConfig' => [ 'username' => 'slave', 'password' => '', 'attributes' => [ // use a smaller connection timeout PDO::ATTR_TIMEOUT => 10, ], ], // 配置從服務(wù)器組 'slaves' => [ ['dsn' => 'dsn for slave server 1'], ['dsn' => 'dsn for slave server 2'], ['dsn' => 'dsn for slave server 3'], ['dsn' => 'dsn for slave server 4'], ], ] 上述配置制定了2個主服務(wù)器和4個從服務(wù)器.
事務(wù)默認(rèn)使用主服務(wù)器的連接,,并且在事務(wù)執(zhí)行中的所有操作都會使用主服務(wù)器的連接,例如: // 在主服務(wù)器連接上開始事務(wù) $transaction = $db->beginTransaction(); try { // 所有的查詢都在主服務(wù)器上執(zhí)行 $rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute(); $transaction->commit(); } catch(\Exception $e) { $transaction->rollBack(); throw $e; } 如果你想在從服務(wù)器上執(zhí)行事務(wù)操作則必須要明確地指定,,比如: $transaction = $db->slave->beginTransaction();
有時你想強制使用主服務(wù)器來執(zhí)行讀查詢,,你可以調(diào)用 $rows = $db->useMaster(function ($db) { return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); }); 你也可以設(shè)置 操作數(shù)據(jù)庫模式獲得模式信息你可以通過 [[yii\db\Schema]]實例來獲取Schema信息: $schema = $connection->getSchema();
該實例包括一系列方法來檢索數(shù)據(jù)庫多方面的信息: $tables = $schema->getTableNames();
更多信息請參考[[yii\db\Schema]] 修改模式除了基礎(chǔ)的 SQL 查詢,[[yii\db\Command]]還包括一系列方法來修改數(shù)據(jù)庫模式:
使用示例: // 創(chuàng)建表 $connection->createCommand()->createTable('post', [ 'id' => 'pk', 'title' => 'string', 'text' => 'text', ]); 看過本文的人還看過
|
|