thinkphp5.*模型增加duplicate方法|tp5、tp5.1增加duplicate方法

14 篇文章 2 订阅

tp6自带了duplicate方法了,但一些老项目用的是tp5和5.1是不支持duplicate的,这时候如果需要用到duplicate 就需要我们自己去实现了

<?php
namespace app\index\model;

use think\Model;

class BaseModel extends Model
{
    // 数据插入 duplicate
    public function insertAllDuplicate($data, $duplicate = null, $limit = null) {
        if (!empty($duplicate)) {
            if (is_array($duplicate)) {
                $temp = [];
                foreach ($duplicate as $key => $item) {
                    if (is_integer($key)) {
                        $temp[] = "{$item} = VALUES({$item})";
                    }
                    else {
                        $temp[] = "{$key} = {$item}";
                    }
                }
                $duplicate = implode(',', $temp);
            }
        }
        if (!empty($limit)) {
            // 分批写入 自动启动事务支持
            $this->startTrans();

            try {
                // array_chunk 函数把数组分割为新的数组块。
                //其中每个数组的单元数目由 size 参数决定。最后一个数组的单元数目可能会少几个。
                //可选参数 preserve_key 是一个布尔值,它指定新数组的元素是否有和原数组相同的键(用于关联数组),还是从 0 开始的新数字键(用于索引数组)。默认是分配新的键。
                $array = array_chunk($data, $limit, true);
                $count = 0;

                foreach ($array as $item) {
                    $sql  = $this->fetchSql(true)->insertAll($item);
                    $sql = preg_replace("/INSERT\s*INTO\s*/", "INSERT IGNORE INTO ", $sql);
                    if (is_string($duplicate)) {
                        $sql = $sql . ' ON DUPLICATE KEY UPDATE '. $duplicate;
                    }
                    $count += $this->execute($sql); // 获取影响函数
                }
                // 提交事务
                $this->commit();
            } catch (\Exception $e) {
                $this->rollback();
                throw $e;
            }
            return $count;
        }
        else {
            $sql = $this->fetchSql(true)->insertAll($data);
            $sql = preg_replace("/INSERT\s*INTO\s*/", "INSERT IGNORE INTO ", $sql);
            if (is_string($duplicate)) {
                $sql = $sql . ' ON DUPLICATE KEY UPDATE '. $duplicate;
            }
            return $this->execute($sql);
        }
    }
}

用法

// 定义产品模型
<?php
namespace app\index\model;

use think\Model;

class Product extends BaseModel
{
}
?>

// 业务代码调用
$ProductModel = new app\index\model\Product();
$dateTime = '2023-06-15 18:00:00';
$ProductModel->insertAllDuplicate([
    ['title' => 'title00000000', 'img' => 'http://img.com/0000.jpg', 'update_time' => dateTime ],
    ['title' => 'title11111111', 'img' => 'http://img.com/11111111.jpg', 'update_time' => dateTime ],
    ['title' => 'title22222222', 'img' => 'http://img.com/22222222.jpg', 'update_time' => dateTime ],
    ['title' => 'title33333333', 'img' => 'http://img.com/33333333.jpg', 'update_time' => dateTime ],
], [
    'title', // title = VALUES(title)
    'update_time' => '{$dateTime}' // update_time = '{$dateTime}'
], 2);
//sql=> INSERT IGNORE INTO `product`(`title`, `img`, `update_time`) VALUES('title00000000', 'http://img.com/0000.jpg', '2023-06-15 18:00:00'), ('title11111111', 'http://img.com/11111111.jpg', '2023-06-15 18:00:00') ON DUPLICATE KEY UPDATE title = VALUES(title), update_time = '2023-06-15 18:00:00';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值