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