批量插入更新upsert
如果问我一批数据根据指定字段插入或者更新,我第一反应是循环去
updateOrCreate
, 事实上从Laravel8
开始这一切变得非常优雅。
updateOrCreate有个非常糟糕的点就是先去查找,没有找到然后在去插入数据,找到了然后去更新,这样效率是很低的。
假设我有一批数据
$data = [
['goods_id' => 1,'title' => '电动牙刷'],
['goods_id' => 2,'title' => '情趣内衣'],
['goods_id' => 3,'title' => 'Iphone12']
]
// example updateOrCreate
foreach($data as $item) {
Product::query()->updateOrCreate(
['goods_id' => $item['goods_id']], $item
);
}
// example upsert
Product::query()->upsert($data, ['goods_id'])
upsert方法的第一个参数是由要插入或更新的值组成,而第二个参数列出相应表中惟一标识记录的列,该方法的第三个也是最后一个参数是一个列数组,即如果数据库中已经存在匹配的记录,应该被更新的列。如果模型上启用了时间戳,upsert
方法将自动设置 created_at
和 updated_at
时间戳
结语
有兴趣的同学可以测试一下,特别是在数据多点的情况下upsert
效率那是高的不是一点点
听说有图会有人点赞
本作品采用《CC 协议》,转载必须注明作者和本文链接
谢谢。谢了
看这个提示,怎么感觉
upsert
跟数据库的INSERT INTO xxx ON DUPLICATE KEY UPDATE
一样呢。。这种操作特别费自增主键。。@白小白 本身就是为了唯一性来做处理的,不用主键也可以,只要是唯一组合就行
封装一下:www.joren.co/create-update-or-dele...