美文网首页
lumen 中实现分表

lumen 中实现分表

作者: 骑代码奔小康 | 来源:发表于2020-06-15 14:59 被阅读0次

有一个日志表数据量很大,所以按每个月为单位生成一个表

一、根据月份创建新的数据表

use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

// 获取当前的时间
$end = Carbon::now();
// 根据表名和年月拼接出新的表名
$table_name = 'h_login_store'.$end->format('Y_m');
// 检查表是否存在数据库中
if( Schema::hasTable($table_name) ){
     echo '存在这个表';
}else{
     echo '不存在这个表';
     // 两种方式创建数据表,任选一种:
     // 1、根据已有的数据表直接复制
     // 2、直接创建新的数据表
     // 复制表,前提是h_login_store表在数据库中存在
     DB::update('create table '.$table_name.' like h_login_store');
     // 创建表
     Schema::create($table_name, function ($table) {
          $table->increments('id');
          $table->char('adname',45);
     });
}
执行后在数据库中就会出现 image.png

二、分表后实现分页、查询

假设已经运行了很久了,有这么一些表
h_login_store_2020_03,h_login_store_2020_04,h_login_store_2020_05
怎么将这些表统一成一个表并进行查询、分页

  1. 先循环查出时间段内的表,并写入到查询集合collect()中
  2. 把collect()中的表用unionAll组装起来
  3. 再吧unionAll的聚合组装成一个临时表进行查询
       // 开始日期
        $start = Carbon::parse('2020-02-01');
        // 结束日期
        $end = Carbon::now();
        // 查询集合
        $queries = collect();
        // 循环比较年月,添加每一张表的查询 
        for ($i = $start->copy(); $i->format('Y-m') <= $end->format('Y-m'); $i->addMonth()) {

            // 按日期循环组装出表名
            $tableName = "h_login_store{$i->format('Y_m')}";
            // 检查这个表是否存在
            if( Schema::hasTable($tableName) ){
                $queries->push(
                    DB::table($tableName)
                        // 建议都用select查询字段,SQL尽可能的优化性能
                        ->select('store_code', 'store_name', 'password', 'store_id','created_at')
                        ->where('store_code','=','234')
                );
            }
        }

        $unionQuery = $queries->shift();
        // 循环剩下的表添加union
        $queries->each(function ($item, $key) use ($unionQuery) {
            $unionQuery->unionAll($item);
        });

        // 把用 unionAll链接起来的sql 组成一个表
        $data = with(new SelectGoods)->setTable('h_login_store')
            // 添加临时表
            ->from(DB::raw("({$unionQuery->toSql()}) AS h_login_store"))
            // 合并查询条件
            ->mergeBindings($unionQuery)
            // 按时间倒序
            ->orderBy('created_at', 'desc')
            // 分页
            ->paginate()
            ->toArray();
         dd($data); //打印看看
image.png

相关文章

  • lumen 中实现分表

    有一个日志表数据量很大,所以按每个月为单位生成一个表 一、根据月份创建新的数据表 执行后在数据库中就会出现 二、分...

  • Lumen实例讲解:第二部分

    一、前言 在前面的文章 Lumen实例讲解:第一部分 中,简单的介绍了 Lumen定时任务系统 的项目结构以及接口...

  • Lumen路由实现

    一、Lumen路由的使用 在了解实现之前,我们先了解其使用的方法以及其作用也是很重要的。Lumen路由对象是在构建...

  • pipeline-中间件的实现

    1、 lumen(5.6) 中间件 类型 lumen 中的中间件份为两种(bootstrap/app.php) :...

  • 多表sql

    实际场景中我们实现数据获取往往是多个表联合操作 eg: 从表group,user,user-group中获得每个分...

  • 《算法》笔记 7 - 符号表、顺序查找、二分查找

    符号表API有序符号表成本模型 无序链表中的顺序查找实现性能 有序数组中的二分查找实现性能 现代计算机和网络使人们...

  • java实现动态实现“分表”

    首先说一下,这个功能其实也不算是很少见,但是也没那么常见。有的时候涉及到的数据量比较大,我们会用一个很时髦的词“分...

  • 小程序Lumen API开发

    Lumen API开发 Laravel和Lumen的区别:Lumen轻量级框架,集合了Laravel的优美语法,支...

  • lumen实现KafkaMQ生产

    条件1:安装zookeeper 条件2:安Kafka 条件3:安RdKafka lumen代码 查看消费 理应如图:

  • 理解 C++ 虚函数表

    引言 虚表是 C++ 中一个十分重要的概念,面向对象编程的多态性在 C++ 中的实现全靠虚表来实现。在聊虚表之前我...

网友评论

      本文标题:lumen 中实现分表

      本文链接:https://www.haomeiwen.com/subject/kdgcxktx.html