thinkphp5水平分割表partition,以及查询操作

前言

先交代下背景,在一个项目中,有一个数据表有水平分表的需求。当时想找到一种方法,把对数据库的操作,写到一个模型里,通过去换模型属性中的table来达到代码不变操作的数据表变化的效果。
我们都知道,模型要想关联数据表的话,有两中方式,第一种就是将模型名和数据表一致。这样模型就会默认关联到名字对应的数据表。第二种就是定义模型的 protected $table 来指定表明。
添加链接描述

模型初始化

ThinkPHP5内置了partition方法,可用于实现简单的分表。新增,修改,删除,查询单条数据时,用parition方法都可以轻松搞定,因为这些操作有一个共同的特点,就是能事先明确的知道,我要操作的是哪一条记录。但有一个需求,ThinkPHP5似乎没有解决,比如当一个大表,被拆分成若干个子表时,如何根据相关条件及排序获取分页数据。这种需求场景下,由于事先并不知道哪些数据会出现在第一页,哪些数据会出现在第二页,这些根据检索条件动态匹配的列表数据,该如何查询呢?

模型层
<?php
namespace app\common\model;
use think\Model;
class WalletLog extends Model
{
   
    protected $table = 'tb_walletlog';
    protected $pk = 'walletid';
    
    private function getRule(){
   
        return [
            'type' => 'mod', // 分表方式
            'num'  => 3     // 分表数量
        ];
    }
    
    public function saveData($data, $user_id){
   
        
        return $this->partition(['user_id' => $user_id], "user_id", $this->getRule())->insert($data);
    }
    
    public function getAll($where, $field = "*", $user_id){
   
        return $this->partition(['user_id' => $user_id], "user_id", $this->getRule())->where($where)->field($field)->select();
    }
    
   //查询所有分割表
    public function getAll2(){
   
        return $this->partition('', '', $this->getRule())->select();
    }
}

分库分表查询分表与其他表关联查询 join 不好使用(各种sql 报错)估计不支持

解决方案:

插入使用分表操作,进行分割数据,查询使用普通联合/聚合查询

1、模型层调整 查询
names
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闰土小蒋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值