如何實現yii2 數據庫讀寫分離配置

來源:文萃谷 3.09W

導語:開始使用數據庫首先需要配置數據庫連接組件,下面小編給大家提供瞭如何實現yii2 數據庫讀寫分離配置,大家可以參考閲讀,更多詳情請關注應屆畢業生考試網。

如何實現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();

  預處理語句

熱門標籤