批量插入更新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 协议》,转载必须注明作者和本文链接
推荐文章: