首页 > 解决方案 > 仅当两列冲突时 Laravel upsert

问题描述

我有下表

id | invoice_id | position | item_name | qty
---|------------|----------|-----------|----
 1 |    1234    |   200    |   shaft   | 2
 2 |    1234    |   202    |   spear   | 1
 3 |    1235    |   200    |   shaft   | 10
 4 |    1235    |   202    |   spear   | 20

仅当AND匹配时,我如何“定位”更新第一行(idis )?如果我为 1234 添加一个500的新项目,它将插入一个新行,否则如果是 200 或 202,它将更新现有的(名称或数量)?1invoice_idpositionpositioninvoice_idposition

我见过 laravel 的 v8upsert()功能,但它只需要一个唯一的标识列,在这种情况下不需要两个。

标签: mysqllaravelupsert

解决方案


使用方法updateOrCreate()。第一个参数是唯一性的条件,第二个参数是属性的其余部分。这是单行版本upsert()

Model::updateOrCreate(
    ['invoice_id' => '1234', 'position' => '500'],
    ['qty' => 5, 'item_name' => 'shaft']
);

upsert()我不限于一个独特的列

Flight::upsert([
    ['invoice_id' => '1234', 'position' => '500', 'qty' => 5, 'item_name' => 'shaft'],
    ['invoice_id' => '1234', 'position' => '600', 'qty' => 10, 'item_name' => 'shaft']
], ['invoice_id', 'position'], ['qty']);

第一个参数用于条目,第二个参数用于标识列的列表,第三个参数用于更新字段(如果找到匹配项)。

除 SQL Server 之外的所有数据库系统都要求提供给 upsert 方法的第二个参数中的列具有“主”或“唯一”索引。

为了能够使用该upsert方法,您需要在由和unique组成的复合键上添加一个约束invoice_idposition


推荐阅读