使用情景:有些項目的數據庫是獨立部署在一臺服務器上,而有時當前項目又須要使用其餘項目的數據庫。其實就是一個基於tp3.2的項目要鏈接兩個數據庫,並能夠在一個模型上能夠同時使用兩個庫。php
1、配置mysql
注:這裏關於數據庫表前綴最好在模型裏經過屬性tablePrefix設置,不建議DB_PREFIX' => 'think_'git
<?php return array( // 數據庫1 "db_option1" => array( 'db_type' => 'mysql', 'db_user' => 'root', 'db_pwd' => 'root', 'db_host' => 'localhost', 'db_port' => '3306', 'db_name' => 'temp_eshop', 'db_charset'=> 'utf8', ), // 數據庫2 "db_option2" => array( 'db_type' => 'mysql', 'db_user' => 'root', 'db_pwd' => 'root', 'db_host' => 'localhost', 'db_port' => '3306', 'db_name' => 'temp_logitcs', 'db_charset'=> 'utf8', ), );
2、設置主數據庫公用模型sql
<?php namespace Common\Model; use Think\Model; class BaseModel extends Model { // 主鏈接的數據庫,db_option1爲該數據庫配置數組鍵 protected $connection = "db_option1"; }
2、設置主數據庫公用模型數據庫
<?php namespace Common\Model; use Think\Model; class BaseModel extends Model { // 主鏈接的數據庫,db_option1爲該數據庫配置數組鍵 protected $connection = "db_option1"; }
3、設置主數據庫下的一張表對應當前模型數組
<?php namespace Home\Model; use Think\Model; use Common\Model\BaseModel; class TestModel extends BaseModel{ // 繼承父模型,表示在主數據庫下的其中一張數據表,如下都是該數據庫下的customan表的操做 protected $tableName = "customan"; public function currentDbTable() { return $this->where(array("id"=>2))->find(); } }
4、在主數據庫下customan切換其餘數據庫服務器
提示:使用tp模型中的db方法實現切換ui
<?php namespace Home\Model; use Think\Model; use Common\Model\BaseModel; class TestModel extends BaseModel{ // 繼承父模型,表示在主數據庫下的其中一張數據表,如下都是該數據庫下的customan表的操做 protected $tableName = "customan"; public function currentDbTable() { return $this->where(array("id"=>2))->find(); } // 多數據庫下混合操做 public function getexids() { // 給主數據庫設爲編號1,而且此方法的$this已指向該數據庫句柄 $this->db(1,"db_option1"); // 注意:越後的設置$this從新指向越日後,這裏支持$this->db(2,"db_option2")->query("select * from user where uid=2")寫法; $this->db(2,"db_option2"); // 編號1數據庫鏈接的一張表的實例 $shop_products = $this->db(1)->table("products"); $shop_users = $this->db(1)->table("users"); // 編號2數據庫鏈接的一張表的實例 $logitcs_customan = $this->db(2)->table("customan"); // 使用編號2數據庫下一張表進行查詢 $res = $logitcs_customan->select(); //$res = $shop_users->select(); //$customans = $this->select() // 返回這次結果 return $res; } }
總結 : 除了在預先定義數據庫鏈接和實例化的時候指定數據庫鏈接外,咱們還能夠在模型操做過程當中動態的切換數據庫,支持切換到相同和不一樣的數據庫類型。this
Model->db("數據庫編號","數據庫配置");spa
數據庫編號用數字格式,對於已經調用過的數據庫鏈接,是不須要再傳入數據庫鏈接信息的,系統會自動記錄。對於默認的數據庫鏈接,內部的數據庫編號是0,所以爲了不衝突,請不要再次定義數據庫編號爲0的數據庫配置。
數據庫配置的定義方式和模型定義connection屬性同樣,支持數組、字符串以及調用配置參數三種格式。
Db方法調用後返回當前的模型實例,直接能夠繼續進行模型的其餘操做,因此該方法能夠在查詢的過程當中動態切換
我的公衆號