thinkphp3.2跨数据库联合查询

使用情景:有些项目的数据库是独立部署在一台服务器上,而有时当前项目又需要使用其他项目的数据库。其实就是一个基于tp3.2的项目要连接两个数据库,并可以在一个模型上可以同时使用两个库。

一、配置

注:这里关于数据库表前缀最好在模型里通过属性tablePrefix设置,不建议DB_PREFIX' => 'think_'

<?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',
            ),
    );

二、设置主数据库公用模型

<?php
    namespace Common\Model;
    use Think\Model;

    class BaseModel extends Model {

        // 主连接的数据库,db_option1为该数据库配置数组键
        protected $connection = "db_option1";

    }

 

二、设置主数据库公用模型

<?php
    namespace Common\Model;
    use Think\Model;

    class BaseModel extends Model {

        // 主连接的数据库,db_option1为该数据库配置数组键
        protected $connection = "db_option1";

    }

 

三、设置主数据库下的一张表对应当前模型

<?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();
    }

}

四、在主数据库下customan切换其他数据库

提示:使用tp模型中的db方法实现切换

<?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;
       
   }

}

 

总结 : 除了在预先定义数据库连接和实例化的时候指定数据库连接外,我们还可以在模型操作过程中动态的切换数据库,支持切换到相同和不同的数据库类型。

Model->db("数据库编号","数据库配置");

数据库编号用数字格式,对于已经调用过的数据库连接,是不需要再传入数据库连接信息的,系统会自动记录。对于默认的数据库连接,内部的数据库编号是0,因此为了避免冲突,请不要再次定义数据库编号为0的数据库配置。

数据库配置的定义方式和模型定义connection属性一样,支持数组、字符串以及调用配置参数三种格式。

Db方法调用后返回当前的模型实例,直接可以继续进行模型的其他操作,所以该方法可以在查询的过程中动态切换

个人公众号

转载于:https://my.oschina.net/u/2456768/blog/1795683

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值