首页 > 其他分享 >laravel 批量插入并在遇到重复键时更新

laravel 批量插入并在遇到重复键时更新

时间:2024-08-15 14:17:58浏览次数:13  
标签:laravel return baseQueryBuilder 批量 values query static array 键时

/**
 * 批量插入并在遇到重复键时更新
 * @param array $values
 * @return bool
 */
public static function insertOnDuplicate(array $values)
{
    if (empty($values)) {
        return true;
    }

    if (!is_array(reset($values))) {
        $values = [$values];
    }

    foreach ($values as $key => $value) {
        ksort($value);
        $values[$key] = $value;
    }

    $eloquentQuery = static::query();
    $sql = static::compileInsertOnDuplicate($eloquentQuery, $values);
    return $eloquentQuery->getConnection()->statement($sql, Arr::flatten($values, 1));
}

/**
 * @param Builder $query
 * @param array $values
 * @return string
 */
protected static function compileInsertOnDuplicate(Builder $query, array $values)
{
    $baseQueryBuilder = $query->getQuery();

    $table = $baseQueryBuilder->getGrammar()->wrapTable($baseQueryBuilder->from);

    if (!is_array(reset($values))) {
        $values = [$values];
    }

    $columns = $baseQueryBuilder->getGrammar()->columnize(array_keys(reset($values)));

    $parameters = collect($values)->map(function ($record) use ($baseQueryBuilder) {
        return '('.$baseQueryBuilder->getGrammar()->parameterize($record).')';
    })->implode(', ');

    $duplicates = collect(explode(',', $columns))->map(function ($column) {
        return "$column = values($column)";
    })->implode(', ');

    return "insert into $table ($columns) values $parameters on duplicate key update $duplicates";
}

标签:laravel,return,baseQueryBuilder,批量,values,query,static,array,键时
From: https://www.cnblogs.com/pine007/p/18360792

相关文章

  • Mybatis如何动态生成插入的列及批量插入值
    有时会遇到根据特定的情况动态创建表,并对表进行批量插入,对于Mybatis来说,也是非常简单的。先看dao层voidinsertBatch(@Param("tableName")StringtableName,@Param("dbColumns")List<String>dbColumns,@Param("dbValues")List<LinkedHashMap>dbValues);注:这里的值d......
  • 如何使用Zabbix API批量修正主机名称
    先说为什么要修正?这其实源自于Ansible安装zabbixagent的一个小Bug。有小伙伴发现,利用ansible批量安装zabbixagent后,zabbix系统上显示的主机名出错了,主机显示的名称都变成了操作系统的IP(如下图),这在一定程度增加了维护难度。如果一台一台去修改和校正主机名将会非常耗费时间,这......
  • 图片批量加水印软件下载
    最近经常做图片,而且还需要加水印,之前用的图片加水印工具是只能一张图片一张图片的加,有很多图片的话处理起来就比较浪费时间,然后在网上找了一个能批量加水印的软件,感觉挺好用的,和大家分享一下,还有以前用的单张图片加水印工具一同分享了。进入正题:1、单张图片加水印工具这是......
  • Unity编辑器批量设置图片格式
    在游戏开发中,经常需要批量设置图片的格式为Sprite类型,手动设置太麻烦,下面的编辑器脚本实现选中文件夹右键/Texture/SetAllImagesToSpriteType实现批量设置图片格式,具体格式参数可自行定义usingSystem;usingSystem.IO;usingUnityEngine;usingUnityEditor;///<summary>......
  • 如何批量新建文件夹?
    1、新建一个excel,在excel中输入批量的文件夹名字2、如下图,在每一个文件夹名称前一单元格输入“MD” 3、如下图,复制这2列内容到文本后将文件另存为4、如下图,在弹出的窗口选择指定保存的后缀、编码格式 5、双击保存后的bat文件即可完成批量建立......
  • pick这4款视频剪辑免费软件,批量剪辑不加班
    现在视频特别流行,不管是为了娱乐还是工作,视频剪辑都变得非常重要。但是找一款免费又好用,还能批量处理多个视频的软件挺不容易的。今天我就给大家推荐几款不错的视频剪辑免费软件。这些软件功能都很强大,剪辑也很方便,能帮你节省很多时间和精力。1.福昕视频工作室传送门✈ ht......
  • 评论如何批量获取,如何获得回复评论,大家相互交流
    importjsonimportrequestsheaders={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/127.0.0.0Safari/537.36','referer':'https://www.douyin.com/channel/3......
  • redis scan 优雅的批量删除
    参考:https://ops-coffee.cn/s/x48wmx_k55hmPfZL0tyBYQ.htmlRedis删除特定前缀key的优雅实现还在用keys命令模糊匹配删除数据吗?这就是一颗随时爆炸的炸弹!Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答......
  • 【MySQL核心】数据恢复-批量修复 ibd 文件实战-拯救即将跑路的你
    简介本文章主要讲解MySQL异常宕机等意外情况下导致ibd文件损坏,配置mysql强制恢复(innodb_force_recovery)1-6级仍然无法启动的情况。下面是恢复整个实例的所有流程和思路。这里恢复的实例是mysql5.6的整个流程,5.7和5.6类似,8.0可以直接用ibd2sql进行坏表的恢......
  • laravel:防止xss攻击
    一,什么是xss?XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得......