Laravel upsert仅当两列冲突时

eaf3rand  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(126)

我有下表

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

如果invoice_idposition匹配,我如何“目标”更新第一行(id1)?如果我为1234的invoice_id添加一个position 500的新项目,它将插入一个新行,否则如果position是200或202,它将更新现有的(名称或数量)?
我见过laravel的v8 upsert()函数,但它只需要一个唯一的标识列,而不是在这种情况下两个。

bxpogfeg

bxpogfeg1#

使用方法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方法,需要在由invoice_idposition组成的复合键上添加unique约束

相关问题