美文网首页
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 中实现分表

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