我正在从另一个服务获取JSON,并希望在表中插入一组数据.我希望它不会每次运行都崩溃.我希望对表的PK保持唯一的约束(因为我不想插入两次相同的数据),但如果发生致命错误,我不希望laravel抛出致命错误(仅在特定表上).

如果我try 插入另一个具有重复主键的数据,如何插入数据并继续插入?

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.
]);

推荐答案

Laravel的查询生成器在v5版中现在有insertOrIgnore个.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的严格模式.

Laravel相关问答推荐

如何在 Laravel 中获取特定月份的最后一个日期?

如何使用PHP版本8.2.6安装beyondcode/laravel-websockets软件包?

Laravel Livewire 组件属性在 div 类中为空

未找到 apiResource 404 中的变量

自从 Laravel 使用 Vite 更新后,我无法运行npm run dev

在 laravel 中查询此类数据的最佳做法是什么?

Laravel 5在blade中 echo 包含html的会话变量

使用 Laravel 和 Passport 验证失败时响应状态码 401?

你如何找到 Laravel 外观背后的底层类?

Laravel 4 的 Cron 作业(job)

Laravel 生产问题 - 使用 Laravel 4.1.x 更新composer

如何在包中安排 Artisan 命令?

Laravel 5.1-5.8 中以前的路由名称

laravel 搜索多个以空格分隔的单词

我如何从给定的日期时间 struct 创建Carbon 对象?

如何在 Laravel 中正确安装软件包?

Laravel 应用程序连接数据库时速度很慢

Laravel 删除集合中的第一项

如何让 Laravel 将 View 的Content-Type标头返回为application/javascript?

如何在没有日志(log)、没有信息的情况下调试 Laravel 错误 500