tp6 orm insertALL 有主键重复的忽略怎么实现-icode9专业技术文章分享

2024/8/31 6:32:49

本文主要是介绍tp6 orm insertALL 有主键重复的忽略怎么实现-icode9专业技术文章分享,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在 ThinkPHP 6 (TP6) 中,使用 ORM 插入数据时,如果遇到主键重复,默认情况下会抛出异常。如果你想忽略这些重复的主键错误,可以使用数据库的 INSERT IGNORE 语句或者 ON DUPLICATE KEY UPDATE 语法。

不过,TP6 的 ORM 目前(截至我的知识截至时间 2023 年 10 月)并不直接支持 .insertAll() 方法的“忽略重复”选项。但你可以通过以下方法来实现这一需求:

方法一:使用原生查询

你可以使用 Db 类执行原生 SQL 语句来实现。

示例代码

use think\facade\Db;

$data = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 1, 'name' => 'Charlie'], // 重复主键
];

// 创建一个插入语句
$sql = "INSERT IGNORE INTO your_table (id, name) VALUES ";

$values = [];
foreach ($data as $item) {
    $values[] = "({$item['id']}, '{$item['name']}')";
}

$sql .= implode(', ', $values);

// 执行原生 SQL
Db::execute($sql);

PHP

方法二:使用事务处理

你可以在循环中插入数据并在捕获到唯一性冲突时忽略异常。

示例代码

use think\facade\Db;

$data = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 1, 'name' => 'Charlie'], // 重复主键
];

// 开始事务
Db::startTrans();
try {
    foreach ($data as $item) {
        Db::name('your_table')->insert($item);
    }
    // 提交事务
    Db::commit();
} catch (\think\db\exception\DataNotFoundException $e) {
    // 忽略主键重复异常
    Db::rollback();
}

PHP

方法三:使用 ON DUPLICATE KEY UPDATE

如果你希望当主键冲突时更新其他字段,可以使用 ON DUPLICATE KEY UPDATE 语法。

示例代码

use think\facade\Db;

$data = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 1, 'name' => 'Charlie'], // 重复主键
];

$values = [];
foreach ($data as $item) {
    $values[] = "({$item['id']}, '{$item['name']}')";
}

$sql = "INSERT INTO your_table (id, name) VALUES " . implode(', ', $values) . 
       " ON DUPLICATE KEY UPDATE name = VALUES(name)"; // 如果主键重复则更新 name

Db::execute($sql);

PHP

总结

在 TP6 中,可以通过原生 SQL 或者采用事务处理的方式来实现插入并忽略重复主键的需求。具体选择哪种方法,可以根据实际需要以及代码的复杂性来决定。

标签: 来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。



这篇关于tp6 orm insertALL 有主键重复的忽略怎么实现-icode9专业技术文章分享的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程