Laravel 8 Eloquent upsert 插入新记录

Mr.*_*.SH 10 laravel eloquent

我正在尝试了解 Laravel 8 的新功能upsert

这是我的示例表:

flights
id (primary key and auto Inc)
departure
destination
price
Run Code Online (Sandbox Code Playgroud)

在我的代码中:

App\Models\Flight::upsert([
    ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['departure', 'destination']);
Run Code Online (Sandbox Code Playgroud)

这是 Laravel 文档中的示例表,它有一个键 id。

departure如果 和都匹配,我想更新记录destination,但这些字段不是唯一的。

每次我运行代码时,它都会插入一条新记录但不会更新。如何开始upsert工作?

我是否需要使 和 都departure变得destination独特,或者在不使它们变得独特的情况下它会起作用吗?

另外,如果我需要使这两个字段都唯一,那么我该如何在迁移中做到这一点?

小智 29

我遇到了同样的问题,我将第二个参数设置为“复合唯一”。

将其添加到迁移中

$table->unique(['departure','destination']); 
Run Code Online (Sandbox Code Playgroud)

问题应该消失了

文档

从 Laravel 9.x 开始,Eloquent 文档页面upsert()已更新,提及依赖于数据库唯一约束的事实:

除 SQL Server 之外的所有数据库都要求 upsert 方法的第二个参数中的列具有“主”或“唯一”索引。此外,MySQL 数据库驱动程序会忽略 upsert 方法的第二个参数,并始终使用表的“主”和“唯一”索引来检测现有记录。


M K*_*aid 5

我相信您需要在第二个参数中传递唯一键,其中第二个参数upsert是表的 id 列和主键,示例数据将是

App\Models\Flight::upsert([
    ['id'=> 1, 'departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['id'=> 2, 'departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['id']);
Run Code Online (Sandbox Code Playgroud)