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

新手上路,请多包涵

我正在从另一个服务获取 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 许可协议

阅读 771
2 个回答

Laravel 的查询生成器现在有 insertOrIgnore 在版本 v5.8.33 及以上:

 <?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 将忽略重复记录,也可能忽略其他类型的错误,具体取决于数据库引擎。例如,insertOrIgnore 将绕过 MySQL 的严格模式。

原文由 Jared Dunham 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以尝试捕获 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
    }
}

原文由 EddyTheDove 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏