日常工作有时需要大批量修改数据,很多时候数据量小比如几条数据有人可能会直接循环执行sql去修改,但是当需要修改的数据对象数量很多时这时这种方法并不可行。因为mysql支持一条语句就可以修改这些数据。
框架一般没有提供批量操作的方法,所以需要自己拼接sql语句然后执行,由于每次遇到批量修改都是临时写方法去拼接sql,浪费时间,这里记录下来,以后直接拿来用。
/**
* @param array $data 修改数据包(二维数组)
* @param string $id 条件,一般为主键
* @param string $table 表名
* @return string
* UPDATE categories SET
display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
*/
function create_update_sql($data=[],$id='',$table=''){
if(empty($data) || !strlen($id) || !strlen($table)) return '';
$id_str=implode(',',array_column($data,$id));
$keys = array_keys(current($data));
$sql="UPDATE {$table} SET";
foreach ($keys as $vol) {
if($vol==$id) continue;
$sql.=" {$vol} = CASE {$id}";
foreach($data as $vo){
$sql.=" WHEN {$vo[$id]} THEN {$vo[$vol]}";
}
$sql.=' END,';
}
$sql=substr($sql,0,-1)." WHERE {$id} IN ({$id_str})";
return $sql;
}