当前位置: 首页 > 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.dtcms.com/a/285500.html

相关文章:

  • UniApp TabBar 用户头像方案:绕过原生限制的实践
  • 依托CCLinkIE转ModbusTCP网关的转换达成西门子PLC连接配置案例
  • 涉及海量数据的查询SQL建议使用“数据库函数”封装并调用
  • Rust实战:高效对接Postman API
  • 【Nginx】nginx+lua+redis实现限流
  • 【Lua】闭包可能会导致的变量问题
  • 去中心化交易所(DEX)深度解析:解码行业头部项目
  • 双向广搜算法详解
  • 【现有资料整理】灵枢 - 用于医学领域的 SOTA 多模态大语言模型
  • 对Yii2中开启`authenticator`后出现的跨域问题-修复
  • .QOI: Lossless Image Compression in O(n) Time
  • 变量命名规则
  • git--gitlab
  • 性能远超Spring Cloud Gateway!Apache ShenYu如何重新定义API网关!
  • 无标记点动捕:如何突破传统娱乐边界,打造沉浸式交互体验
  • 高速公路自动化安全监测主要内容
  • Elasticsearch+Logstash+Filebeat+Kibana部署(单机部署)
  • 在 Jenkins 中使用 SSH 部署密钥
  • JAVA高级第五章,简易超市会员管理系统
  • sqli-labs靶场通关笔记:第29-31关 HTTP参数污染
  • Android 应用保活思路
  • 小红书采集工具:无水印图片一键获取,同步采集笔记与评论
  • 银河麒麟高级服务器V10(ARM)安装人大金仓KingbaseES完整教程
  • 【unitrix】 6.7 基本结构体(types.rs)
  • IDEA插件离线安装
  • Vue3 Anime.js超级炫酷的网页动画库详解
  • 完整的 Meteor NPM 集成
  • 游戏常用运行库合集下载 - 提升游戏与软件体验
  • Nestjs框架: 基于TypeORM的多租户功能集成
  • Linux C 进程间通信基本操作