thinkphp5数据库分库时model操作支持

使用thinkphp5.0实现业务功能时,遇到一个问题,同表分库场景下,用model类实例无法支持多数据库sql操作。

场景如下:
db1.test
db2.test
db3.test
...

当使用:

$model = new Test([],'db1');
$model->where('id',1)->find();

$model = new Test([],'db2');
$model->where('id',2)->find();
当我们要查询db2的数据表时,查到的还是db1.test表的。

解决办法:

thinkphp/library/think/Model.php  259行

public function getQuery($buildNewQuery = false)
    {
        if ($buildNewQuery) {
            return $this->buildQuery();
        } elseif (!isset(self::$links[$this->class])) {
            // 创建模型查询对象
            self::$links[$this->class] = $this->buildQuery();
        }
        return self::$links[$this->class];
    }

改造为:

public function getQuery($buildNewQuery = false)
    {
        if ($buildNewQuery) {
            return $this->buildQuery();
        } elseif (!isset(self::$links[$this->class.':'.($this->connection['database']??'')])) {
            // 创建模型查询对象
            self::$links[$this->class.':'.($this->connection['database']??'')] = $this->buildQuery();
        }
        return self::$links[$this->class.':'.($this->connection['database']??'')];
    }

这样同一model在不同database时,就可建立不同连接进行操作,不会出现上面的问题了。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值