我正在从另一个服务获取 JSON,并想在表中插入一堆数据。我想以一种每次运行它都不会崩溃的方式来做。我想对表的 PK 保留我的唯一约束,(因为我不想两次插入相同的数据)但是,我不希望 laravel 在发生时抛出致命错误(仅在特定表上) ).
如果我尝试插入另一个具有重复主键的数据,我该如何插入我的数据并继续插入?
Schema::create('dummy', function (Blueprint $table) {
$table->integer('id')->unique();
$table->string('name',100);
});
从另一个 API 获取一堆 JSON。然后插入所有行:
{
'id':1,
'name': 'one'
},{
'id':2
'name':'two'
}
那使得。
DB::table('dummy')->insert([
['id' => 1, 'name' => 'one'],
['id' => 2, 'name' => 'two']
]);
然后改天,第 3 方 API 上有新数据。并想更新我的数据库:
获取 json,并接收:
{
'id':1,
'name': 'one'
},{
'id':2
'name':'two'
},{
'id':3
'name':'three'
}
这使得:
DB::table('dummy')->insert([
['id' => 1, 'name' => 'one'], // <-- will crash there cause PK already existe, but want to keep inserting
['id' => 2, 'name' => 'two'], // <-- skipp cause already exist
['id' => 3, 'name' => 'three'] // insert that line.
]);
原文由 poudigne 发布,翻译遵循 CC BY-SA 4.0 许可协议
Laravel 的查询生成器现在有
insertOrIgnore
在版本 v5.8.33 及以上:在这里阅读更多: https ://laravel.com/docs/5.8/queries#inserts
请注意,
insertOrIgnore
将忽略重复记录,也可能忽略其他类型的错误,具体取决于数据库引擎。例如,insertOrIgnore 将绕过 MySQL 的严格模式。