lumen 中实现分表

2020-06-15  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读