thinkphp3.2跨數據庫聯合查詢

使用情景:有些項目的數據庫是獨立部署在一臺服務器上,而有時當前項目又須要使用其餘項目的數據庫。其實就是一個基於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方法調用後返回當前的模型實例,直接能夠繼續進行模型的其餘操做,因此該方法能夠在查詢的過程當中動態切換

我的公衆號

相關文章
相關標籤/搜索