mysql - 仅当两列冲突时 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匹配时,我如何“定位”更新第一行(id
is )?如果我为 1234 添加一个500的新项目,它将插入一个新行,否则如果是 200 或 202,它将更新现有的(名称或数量)?1
invoice_id
position
position
invoice_id
position
我见过 laravel 的 v8upsert()
功能,但它只需要一个唯一的标识列,在这种情况下不需要两个。
解决方案
使用方法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
推荐阅读
- javascript - 一键式按钮适用于大屏幕,但在手机设备上只有双击有效
- java - IllegalArgumentException:在为“XML 解析器不应易受 XXE 攻击”实施 sonarqube 解决方案时不支持
- sql-server - 从 XML 的所有路径中获取键的值
- javascript - 如何监视命名函数?
- r - 获取 read.csv 中与 write.csv 中相同的文件名
- swift - swift中集合视图单元格内的按钮操作
- json - 在 AppModule 中阅读 Appsetting - Angular 8
- amazon-web-services - Amazon Pinpoint 彩信通知?
- java - Java - 如何解密 Chrome cookie?
- python - 未定义的变量“json”