共计 687 个字符,预计需要花费 2 分钟才能阅读完成。
在日常开发中经常会遇到数据的新增和更新,对于已经存在的数据,直接覆盖,对于不存在的数据就写入一条新的记录。
按照常规思路来说,一般都只能通过 foreach 循环来处理,先查询,再判断,再执行,对于少量数据还可以,但是对于大量数据,这样效率就太低了
<?php
// $data 是需要处理的数据集
foreach($data){if(DB::('users')->find($data['id'])){// 进行更新操作}else{// 进行新增操作}
}
对于大量数据批量执行下来,很容易出现超时等情况,造成处理失败,所以 Laravel 提供了一个批量处理方法,`upsert`:
upsert
该方法的第一个参数包含要插入或更新的值,而第二个参数列出了在关联表中唯一标识记录的列。该方法的第三个也是最后一个参数是一个列数组,如果数据库中已经存在匹配的记录,则应该更新这些列。如果在模型上启用了时间戳,
upsert
方法将自动设置
来看个例子:
Flight::upsert([
['start' => 'beijing', 'end' => 'shanghai', 'price' => 500],
['start' => 'shenzhen', 'end' => 'beijing', 'price' => 800]
], ['start', 'end'], ['price']);
在上面的示例中,会根据第二个数组内的关键字段进行查询,如果存在就更新 price 参数值。
重要提示
该方法在使用时候,根据文档提示,需要为第二个数组建立索引关系,否则这个方法并不会正常新增或者更新,只会不停的新增下去,所以在确定好更新关系之后,切记做好索引关系的配置。
正文完
加入官方交流QQ群:778957856