Hyperf数据库批量更新

2023-11-12

Hyperf没有批量更新的功能,网上的支持也比较少

但Hyperf是基于laravel的orm,因此可以搜下大神们写的laravel的批量更新的方法

//批量更新
    public function updateBatch($multipleData = [])
    {
        try {
            $tableName = Db::getTablePrefix() . $this->getTable();
            $firstRow  = current($multipleData);

            $updateColumn = array_keys($firstRow);
            // 默认以id为条件更新
            $referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
            unset($updateColumn[0]);
            $updateSql = "UPDATE " . $tableName . " SET ";
            $sets      = [];
            $bindings  = [];
            foreach ($updateColumn as $uColumn) {
                $setSql = "`" . $uColumn . "` = CASE ";
                foreach ($multipleData as $data) {
                    $setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
                    $bindings[] = $data[$referenceColumn];
                    $bindings[] = $data[$uColumn];
                }
                $setSql .= "ELSE `" . $uColumn . "` END ";
                $sets[] = $setSql;
            }
            $updateSql .= implode(', ', $sets);
            $whereIn   = collect($multipleData)->pluck($referenceColumn)->values()->all();
            $bindings  = array_merge($bindings, $whereIn);
            $whereIn   = rtrim(str_repeat('?,', count($whereIn)), ',');
            $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
            return Db::update($updateSql, $bindings);
        } catch (\Exception $e) {
            return false;
        }
    }

如果数据太多的话最好切分成多次更新,那样的效果可以快上好几倍,实测


                    $Model = new Model();//创建模型
                    //把获得的数据按200条执行一次分割
                    $chunk_datas = array_chunk($Data['insert'], 200, true);
                    foreach ($chunk_datas as $chunk_data) {
                        $Model->insert($chunk_data);
                    }
                    if(count($Data['update'])>0){
                        $chunk_datas = array_chunk($Data['update'], 100, true);
                        foreach ($chunk_datas as $chunk_data) {
                            $Model->updateBatch($chunk_data);
                        }
                    } 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hyperf数据库批量更新 的相关文章

随机推荐

  • 学习太极创客 — MQTT(七)MQTT 主题进阶

    视频链接 https www bilibili com video BV1Va4y1W7Ub spm id from autoNext vd source b91967c499b23106586d7aa35af46413 资料链接 http
  • 来袭!SOLIDWORKS 2024 主要增强功能

    在SOLIDWORKS软件使用过程中 我们知道您创建了出色的设计 您的出色设计也会得到构建 为了简化和加快从概念到制造产品的产品开发流程 SOLIDWORKS 2024 包含用户驱动的全新增强功能 重点关注 提高工作智能化程度 通过更有效地
  • 软件测试及自动化测试

    软件测试面经 文章目录 软件测试面经 软件测试理论 1 GET和POST请求区别 2 web service的接口如何测试 3 cookie session与Token的区别 4 接口测试该怎么测 5 postman和jemter的区别 6
  • java 151建议_JAVA开发中151个建议

    1 不在常量和变量中出现混淆的字母 2 莫让常量蜕变成变量 3 三元操作符的类型必须一致 4 避免带有变长参数的方法重载 5 别让null值和空值威胁到变长方法 KISS原装 Keep It simple stupid即懒人原装 6 覆写变
  • 6.4集合类

    1 什么是集合 将多个对象合在一起变成一个统一的对象 然后通过这个统一的对象来实现对多个对象的管理 存储 检索 操作 传输数据 在数组里要进行这样的操作 可以会写很多算法 但在集合里 只需要调用其中的方法就可以了 集合也可以对其中的元素进行
  • 【java】Java -jar 运行的程序如何 本地代码远程调试服务器程序

    1 概述 因为要在服务器上进行es远程认证 需要先写个包进行测试一下 需要远程调用 那么改怎么做呢 远程服务命令配置 在服务器启动java jar包的命令中添加 Xdebug Xrunjdwp transport dt socket ser
  • 1033 旧键盘打字 (20分)

    这道题很坑的一点就是 有可能坏掉的键盘是空串 所有的键都是好的 如下测试用例 input NULL abcdefg output abcdefg 所以 用字符串数组的不能直接用scanf s str 读入 用string的也不能直接用cin
  • 计算机提示xinput1_3.dll丢失的三个解决方法?哪个更好用

    在遇到xinput1 3 dll丢失的问题后 我不得不花费一些时间和精力来尝试修复这个错误 这个问题导致我无法正常运行一些游戏或应用程序 给我的计算机使用带来了一些不便 问题描述 在使用计算机过程中 您可能会遇到一个错误提示 指示xinpu
  • sentinel 官方文档_Sentinel 限流与熔断初探(技巧篇)

    温馨提示 源码分析 Alibaba Sentinel 专栏开始连载 本文展示如何学习一个全新的技术的方法 该专栏基于 1 7 0 版本 在学习一个新技术或新框架时 建议先查看其官方文档以获得对其形成一个整体的认识 https github
  • 第十四章 netlink机制--基于Linux3.10

    Netlink基于网络的消息机制 能够让用户和内核空间进行通信 12 3节提到的ifconfig是使用ioctl方法和内核通信的 而ip命令则是使用netlink和内核通信的 该机制初衷是为网络服务的 但是现在起应用范围已经大大扩展 14
  • 转型IT之路七大部分从0到1全方位探秘:非科班出身如何顺利进入IT领域

    目录 了解IT领域的多样性和趋势 探索IT领域的不同方向和专业 分析市场需求和趋势 技术栈的基本概念和术语 自我评估和制定职业规划 确定个人兴趣和目标 分析现有技能和经验 设定合理的转型时间表和目标 寻求专业意见和建议 制定灵活的计划 培养
  • LaTeX页眉页脚自定义【有图有代码】

    LaTeX页眉页脚自定义 有图有代码 一 自定义页眉页脚示例 双页文档 fancyhead fancyfoot 1 代码讲解 2 自定义代码 3 页眉和页脚的装饰线 4 总页数 二 自定义页眉页脚示例 单页文档 rhead rfoot 三
  • “学习方法”学习笔记(一)费曼技巧

    以下为引用部分 作者 pimgeek 链接 https www zhihu com question 20576786 answer 21770899 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 特别说明
  • iOS集成Bugly详解

    异常上报 SDK 集成 通过CocoaPods集成 新建项目 cd 项目目录 vim Podfile source https github com CocoaPods Specs git inhibit all warnings plat
  • 服务器运维管理

    运维人员在日常维护服务器方面避免不了对服务器进行批量管理操作 那站长人群一般都用什么工具管理服务器呢 以下是个人用的对于服务器管理比较便捷的软件 该软件产地 中国 软件名称 IIS7远程桌面 可自行百度查询 系统 目前支持win所有系统 特
  • Java程序员的专属社区

    一个人走的快 一群人走的远 这是Java程序员专属社区创立的初衷 Java程序员大本营 是面向工作1 3年 希望提升专业技术能力的Java 开发者建立 致力于Java知识的分享 交流与学习 点击关注 Java程序员大本营 我们希望通过CSD
  • 程序猿的三高:高并发、高可用、高性能

    一 高并发指标 高并发是现在互联网分布式框架设计必须要考虑的因素之一 它是可以保证系统能被同时并行处理很多请求 对于高并发来说 它的指标有 响应时间 系统对进来的请求反应的时间 比如你打开一个页面需要1秒 那么这1秒就是响应时间 吞吐量 吞
  • 苹果ipa包发布在IIS环境记录

    项目以前IOS打包都是发布到了蒲公英上 不过最近蒲公英突然升级 之前的发布记录全都没了不说 再次上传居然没有公开选项了 也就是说用户每次下载安装都需要输入一个预设密码 最奇葩的是你连接中包含了密码也没用 打开连接时没密码 点安装却提示你要输
  • Linux内存管理(7) - page fault

    了解linux page fault 1 概述 A page fault sometimes called PF PF or hard fault a is a type of exception raised by computer ha
  • Hyperf数据库批量更新

    Hyperf没有批量更新的功能 网上的支持也比较少 但Hyperf是基于laravel的orm 因此可以搜下大神们写的laravel的批量更新的方法 批量更新 public function updateBatch multipleData