当前位置: 首页 > news >正文

分表聚合助手类

下面是一个分表聚合助手类的推荐实现方式,你可以将其放在 app/model/TaskRecord.php 或单独新建一个 app/model/ShardingHelper.php 文件,适用于所有类似分表模型(如 TaskRecord、StarRecord)。


分表聚合助手(通用版)

namespace app\model;use support\Db;
use Illuminate\Support\Collection;class ShardingHelper
{/*** 获取所有分表表名* @param string $baseTableName 例如 'ss_task_records'* @param int $shardCount* @return array*/public static function getAllShardTables($baseTableName, $shardCount = 16){$tables = [];for ($i = 0; $i < $shardCount; $i++) {$tables[] = "{$baseTableName}_{$i}";}return $tables;}/*** 跨所有分表聚合查询* @param string $baseTableName* @param callable $queryCallback function($queryBuilder, $tableName)* @param int $shardCount* @return Collection*/public static function unionAll($baseTableName, callable $queryCallback, $shardCount = 16){$all = collect();foreach (self::getAllShardTables($baseTableName, $shardCount) as $table) {$query = Db::table($table);$result = $queryCallback($query, $table);if ($result instanceof \Illuminate\Support\Collection) {$all = $all->merge($result);} elseif (is_array($result)) {$all = $all->merge($result);}}return $all;}
}

使用示例

1. 查询所有分表中 user_id in [1,2,3] 的任务

use app\model\ShardingHelper;$userIds = [1,2,3];
$allRecords = ShardingHelper::unionAll('ss_task_records', function($query) use ($userIds) {return $query->whereIn('user_id', $userIds)->get();
});

2. 查询所有分表的任务总数

$total = ShardingHelper::unionAll('ss_task_records', function($query) {return $query->count();
})->sum();

3. StarRecord 跨分表查询

$allStars = ShardingHelper::unionAll('ss_star_records', function($query) {return $query->where('type', 'earn')->get();
});

说明

  • 你可以把 ShardingHelper 放在 app/model/ 目录,所有分表模型都能用。
  • 只需传入基础表名(如 ‘ss_task_records’),即可跨所有分表聚合。
  • 回调里用 $query 写任何你想要的查询,返回 Collection 或数组即可。
http://www.lryc.cn/news/592263.html

相关文章:

  • 分布式面试点
  • RecyclerView与ListView深度对比分析
  • 从复合变量到分组分析:piecewiseSEM 解析生态系统多因子交互作用
  • UDP 协议下一发一收通信程序的实现与解析
  • Linux 定时任务全解析:atd 与 crond 的区别及实战案例(含日志备份 + 时间写入)
  • AugmentCode还没对个人开放?
  • 双通达信多板块同步
  • 如何抉择HTTPSProxy?
  • AR技术重塑电力巡检:效率提升与智能升级
  • 三维重建一: 相机几何
  • 基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
  • Go语言实战案例-斐波那契数列生成器
  • 9. isaacsim4.2教程-ROS加相机/CLOCK
  • pgsql导出导入超过50G数据、解决方法
  • hive分区表临时加载日批数据文件
  • MyBatis 动态 SQL:让 SQL 语句随条件灵活变化
  • [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精
  • 美创科技建设项目被评为中国信通院医疗领域“磐安”优秀案例
  • 禁止拖动视频进度条来保障视频安全?
  • 西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访庭田科技
  • 免费PDF文件格式转换工具
  • 如何选择旅游科技行业云ERP?Oracle NetSuite助力汇智国际数智化升级
  • 【世纪龙科技】汽车故障诊断与排除仿真教学软件让课堂更高效安全
  • TCL 电视安装 APK 文件主要有 U 盘安装——仙盟创梦IDE
  • Java并发编程性能优化实践指南:锁分离与无锁设计
  • PYTHON日志神器nb_log详细介绍和使用说明
  • 数据统计模块后端架构解析:从Controller到SQL的ECharts数据对接实践
  • div和span区别
  • 为什么IoTDB成为物联网场景的技术优选?
  • Vue3 业务落地全景:脚手架、权限、国际化、微前端、跨端与低代码 50 条实战心法