插入重复键时的 laravel 雄辩忽略错误

2022-08-31 00:24:55

我正在从另一个服务获取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']
]);

然后另一天,第三方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.
]);

答案 1

Laravel 的查询生成器现在的版本为 v5.8.33 及更高版本:insertOrIgnore

<?php
DB::table('users')->insertOrIgnore([
    ['id' => 1, 'email' => 'taylor@example.com'],
    ['id' => 2, 'email' => 'dayle@example.com']
]);

在此处阅读更多内容: https://laravel.com/docs/5.8/queries#inserts


请注意,将忽略重复记录,并且还可能忽略其他类型的错误,具体取决于数据库引擎。例如,insertOrIgnore将绕过MySQL的严格模式。insertOrIgnore


答案 2

您可以尝试捕获 PDO 异常

try 
{
    // inserting in DB;
}
catch(\Illuminate\Database\QueryException $e){
    // do what you want here with $e->getMessage();
}

或者,但不确定,您可以尝试使用数据库事务:

public function insertInDB()
{
    DB::transaction(function () {
        DB::table(...);
        // if everything is fine, it will commit, else, it will rollback
    }
}

推荐