如何解决Laravel 仅当两列冲突时才插入
我有下表
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
仅当 id
AND 1
匹配时,我如何“定位”更新第一行(invoice_id
为 position
)?如果我为 1234 的 position
添加一个带有 invoice_id
500 的新项目,它会插入一个新行,否则如果 position
是 200 或 202,它会更新现有的(名称或数量)?
我已经看到了 laravel 的 v8 upsert()
函数,但它只需要一个唯一的标识列,在这种情况下不需要两个。
解决方法
使用方法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_id
组成的组合键上添加一个 position
约束
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。