如何實現yii2 數據庫讀寫分離配置
- php語言
- 關注:3W次
導語:開始使用數據庫首先需要配置數據庫連接組件,下面小編給大家提供瞭如何實現yii2 數據庫讀寫分離配置,大家可以參考閲讀,更多詳情請關注應屆畢業生考試網。
開始使用數據庫首先需要配置數據庫連接組件,通過添加 db 組件到應用配置實現("基礎的" Web 應用是 config/),DSN( Data Source Name )是數據源名稱,用於指定數據庫信息.如下所示:
return [
// ...
'components' => [
// ...
'db' => [
'class' => 'yiidbConnection',
'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', //數據庫用户名
'password' => '', //數據庫密碼
'charset' => 'utf8',
],
],
// ...
];
請參考PHP manual獲取更多有關 DSN 格式信息。 配置連接組件後可以使用以下語法訪問:
$connection = Yii::$app->db;
請參考[[yiidbConnection]]獲取可配置的屬性列表。 如果你想通過ODBC連接數據庫,則需要配置[[yiidbConnection::driverName]] 屬性,例如:
'db' => [
'class' => 'yiidbConnection',
'driverName' => 'mysql',
'dsn' => 'odbc:Driver={MySQL};Server=localhost;Database=test',
'username' => 'root',
'password' => '',
],
注意:如果需要同時使用多個數據庫可以定義 多個 連接組件:
return [
// ...
'components' => [
// ...
'db' => [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=localhost;dbname=mydatabase',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
'secondDb' => [
'class' => 'yiidbConnection',
'dsn' => 'sqlite:/path/to/database/file',
],
],
// ...
];
在代碼中通過以下方式使用:
$primaryConnection = Yii::$app->db;
$secondaryConnection = Yii::$app->secondDb;
如果不想定義數據庫連接為全局應用組件,可以在代碼中直接初始化使用:
$connection = new yiidbConnection([
'dsn' => $dsn,
'username' => $username,
'password' => $password,
]);
$connection->open();
小提示:如果在創建了連接後需要執行額外的 SQL 查詢,可以添加以下代碼到應用配置文件:
return [
// ...
'components' => [
// ...
'db' => [
'class' => 'yiidbConnection',
// ...
'on afterOpen' => function($event) {
$event->sender->createCommand("SET time_zone = 'UTC'")->execute();
}
],
],
// ...
];
SQL 基礎查詢
一旦有了連接實例就可以通過[[yiidbCommand]]執行 SQL 查詢。
SELECT 查詢
查詢返回多行:
$command = $connection->createCommand('SELECT * FROM post');
$posts = $command->queryAll();
返回單行:
$command = $connection->createCommand('SELECT * FROM post WHERE id=1');
$post = $command->queryOne();
查詢多行單值:
$command = $connection->createCommand('SELECT title FROM post');
$titles = $command->queryColumn();
查詢標量值/計算值:
$command = $connection->createCommand('SELECT COUNT(*) FROM post');
$postCount = $command->queryScalar();
UPDATE, INSERT, DELETE 更新、插入和刪除等
如果執行 SQL 不返回任何數據可使用命令中的 execute 方法:
$command = $connection->createCommand('UPDATE post SET status=1 WHERE id=1');
$command->execute();
你可以使用insert,update,delete 方法,這些方法會根據參數生成合適的SQL並執行.
// 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();
引用的表名和列名
大多數時間都使用以下語法來安全地引用表名和列名:
$sql = "SELECT COUNT([[$column]]) FROM {{table}}";
$rowCount = $connection->createCommand($sql)->queryScalar();
以上代碼[[$column]] 會轉變為引用恰當的列名,而{{table}} 就轉變為引用恰當的表名。 表名有個特殊的變量 {{%Y}} ,如果設置了表前綴使用該變體可以自動在表名前添加前綴:
$sql = "SELECT COUNT([[$column]]) FROM {{%$table}}";
$rowCount = $connection->createCommand($sql)->queryScalar();
如果在配置文件如下設置了表前綴,以上代碼將在 tbl_table 這個表查詢結果:
return [
// ...
'components' => [
// ...
'db' => [
// ...
'tablePrefix' => 'tbl_',
],
],
];
手工引用表名和列名的另一個選擇是使用[[yiidbConnection::quoteTableName()]] 和 [[yiidbConnection::quoteColumnName()]]:
$column = $connection->quoteColumnName($column);
$table = $connection->quoteTableName($table);
$sql = "SELECT COUNT($column) FROM $table";
$rowCount = $connection->createCommand($sql)->queryScalar();
預處理語句
- 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-mo/jsj/php/1v1gne.html