Yii2分庫的實現方法

2021-08-22 04:54:55 字數 3642 閱讀 7257

工作遇到了分庫的問題,所謂分庫,不是單指是用多個資料庫,而是將單個資料庫拆分成多個邏輯功能平行的庫(通俗的舉例說就是講乙個資料庫拷貝多份,然後分給每個公司客戶乙個,它們各自用自己的)。廢話不多說,下面介紹使用方法,此為本人原創,筆者架構水平經驗有限,僅供參考。

一.首先,需要了解yii2使用多個資料庫的方法

1.在配置檔案中(建議main-local.php)中加上資料庫配置:

'components' => [

//單庫

'db1' => [

'class' => 'yii\db\connection',

'dsn' => 'mysql:host=127.0.0.1;dbname=dbname1',

'username' => '****',

'password' => '****',

'charset' => 'utf8',

'tableprefix' => 'tpr_',

],//單庫

'db2' => [

'class' => 'yii\db\connection',

'dsn' => 'mysql:host=127.0.0.1;dbname=dbname2',

'username' => '****',

'password' => '****',

'charset' => 'utf8',

'tableprefix' => 'tpr_',

],]

2.直接使用的方法:

$res1 = $db->createcommand('select * from user limit 1')->queryone();

$query = new \yii\db\query();

$res2 = $query->where(array('id'=>1))->from('user')->limit(1)->one($db);

3.使用模型,首先在models目錄下建立user.php,示例目錄是\common\models\dbname1\:

<?php

namespace common\models\dbname1;

use yii\db\activerecord;

class user extends activerecord

}

使用方法:

$user = new \common\models\core\user();

$res1 = $user::find()->where(array('id'=>1))->limit(1)->asarray()->one();

$query = new \yii\db\query();

$res2 = $query->where(array('id'=>1))->from($user::tablename())->limit(1)->one($user::getdb());

二.在使用多個庫的情況下再進行分庫

1.首先將配置中的class改為自定義的class,示例的類檔案為\common\components\db\mysqlconnection.php:

'components' => [

//分庫

'db1' => [

'class' => 'common\components\db\mysqlconnection',

'dbname' => 'dbname1',

'charset' => 'utf8',

'tableprefix' => 'tpr_',

], //分庫

'db2' => [

'class' => 'common\components\db\mysqlconnection',

'dbname' => 'dbname2',

'charset' => 'utf8',

'tableprefix' => 'tpr_',

],]

2.編寫mysqlconnection類:

<?php

namespace common\components\db;

class mysqlconnection extends \yii\db\connection;port=;dbname=";

$myconfig['username'] = $username??$config['username'];

$myconfig['password'] = $password??$config['password'];

$myconfig['charset'] = $charset??$config['charset'];

if(isset($config['tableprefix']))

//例項化資料庫連線類

parent::__construct($myconfig);

}}

直接使用的方法:

//使用初始化的連線

//自定義引數的連線,會覆蓋配置檔案中的引數

$config = array(

//分庫的配置引數,此處的處理邏輯及引數規則需要自己在mysqlconnection.php裡編寫,這裡只給個思路

'db' => 'db2', //使用db2的配置引數

'fk_config' => array(

'val1' => '****',

'val3' => '****',

'val3' => '****',

));$db2 = new \common\components\db\mysqlconnection($config);

3.在模型中使用,先修改模型檔案user.php

namespace common\models\dbname1;

use yii\db\activerecord;

class user extends activerecord

parent::__construct();

}public static function getdb()else

}}

使用方法:

//使用初始化的引數

$user = new \common\models\dbname1\user();

//自定義引數的模型,會覆蓋配置檔案中的引數

$fk_config = array(

//分庫的配置引數,此處的處理邏輯及引數規則需要自己在mysqlconnection.php裡編寫,這裡只給個思路

'val1' => '****',

'val3' => '****',

'val3' => '****',

);$user = new \common\models\dbname1\user($fk_config);

其實每個資料表模型中都要寫__construct()和getdb()是不太合理的,可以寫個通用模型作為父類寫入__construct()和getdb(),然後資料表模型繼承此模型即可,筆者就是這麼做的但沒有寫出來,因為寫出來會增加閱讀和理解難度,讀者可以自己去嘗試。

Yii2實現快速切庫操作

開發中可能會遇到一些這樣的問題,比如本地乙個資料庫,線上乙個資料庫,測試環境乙個資料庫,協同辦公乙個資料庫,有時候需要進行不斷切換資料庫,這裡操作是在config資料夾下快速更改db.php的內容 首先yii2中db.php檔案的內容是 return class yii db connection ...

Yii2 中實現單點登入的方法

修改 common config main.php 一 在 config 頭部上加上以下 二 在 config 的 components 配置中加入 程式設計客棧 identityclass common models user enableautolo程式設計客棧gin true,identity...

Yii2建立modules方法

yii2本身支援建立版本分支,這裡面有些坑需要記錄一下 在模組下的main.php檔案return的陣列中直接新增 第一種方式 aliases frontend modules modules class module 第二種方式 modules v1 v1模組 class frontend mod...