有时候需要批量修改数据,如果循环修改单个,则会非常影响数据库连接量,比较好的方式就是拼接成一条sql,一次执行
/**
* 批量更新
* @param [arr] $datas [要保存的数据集]
*
$data[] = array('id'=>1,'value'=>value1);
$data[] = array('id'=>2,'value'=>value2);
$data[] = array('id'=>3,'value'=>value3);
* @param [string] $database_table_name [数据库表名]
* @param [string] $primary_key [主键名]
* @return [int] [成功修改的条数]
*/
function dbSaveAll($datas, $database_table_name, $primary_key){
$sql = ''; //Sql
$lists = []; //记录集$lists
$pk = $primary_key;//获取主键
foreach ($datas as $data) {
foreach ($data as $key=>$value) {
if($pk===$key){
$ids[]=$value;
}else{
$lists[$key].= sprintf("WHEN %u THEN '%s' ",$data[$pk],$value);
}
}
}
foreach ($lists as $key => $value) {
$sql.= sprintf("`%s` = CASE `%s` %s END,",$key,$pk,$value);
}
$sql = sprintf('UPDATE __%s__ SET %s WHERE %s IN ( %s )',strtoupper($database_table_name),rtrim($sql,','),$pk,implode(',',$ids));
return M()->execute($sql);
}
调用
// 保存到数据库
$result = dbSaveAll($vote_projects, 'Vote_project', 'order_number');
if($result){
$this->success('写入成功!', __APP__ . '/Admin/Vote/get_all_pro');
}
else {
$this->error('数据已同步,无需重复写入');
}