thinkphp 同时更新多条数据

来源:互联网 发布:美国 制造业回归 知乎 编辑:程序博客网 时间:2024/06/07 01:47


 有时候需要批量修改数据,如果循环修改单个,则会非常影响数据库连接量,比较好的方式就是拼接成一条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('数据已同步,无需重复写入');        }