Laravel 8 Eloquent插入新记录

but5z9lq  于 2022-12-01  发布在  其他
关注(0)|答案(3)|浏览(141)

我试图了解Laravel 8的新功能upsert
下面是我的示例表:

flights
id (primary key and auto Inc)
departure
destination
price

在我的代码中:

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

这是Laravel文档中的示例表,它有一个键ID。
如果departuredestination都匹配,但这些字段不是唯一的,我希望更新记录。
每次运行代码时,它都会插入一条新记录,但不会更新。如何让upsert工作?
我需要使departuredestination都是唯一的,还是不使它们唯一就能工作?
此外,如果我需要使两个字段都是唯一的,那么我如何在迁移中做到这一点?

ua4mk5z4

ua4mk5z41#

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

$table->unique(['departure','destination']);

问题应该解决了

文档

从Laravel 9.x开始,Eloquent文档页面进行了更新,提到upsert()依赖于DB唯一约束:
除SQL Server外,所有数据库都要求upsert方法的第二个参数中的列具有“主”或“唯一”索引。此外,MySQL数据库驱动程序忽略upsert方法的第二个参数,始终使用表的“主”和“唯一”索引来检测现有记录。

r55awzrz

r55awzrz2#

我认为您需要在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']);
hs1ihplo

hs1ihplo3#

您需要第三个参数来更新数据行。

Flight::upsert([
    ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['departure', 'destination'], ['price']);

相关问题