有一个日志表数据量很大,所以按每个月为单位生成一个表
一、根据月份创建新的数据表
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
怎么将这些表统一成一个表并进行查询、分页
- 先循环查出时间段内的表,并写入到查询集合collect()中
- 把collect()中的表用unionAll组装起来
- 再吧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
网友评论