Thinkphp批量更新数据的方法汇总


Posted in PHP onJune 29, 2016

以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步!

方法一:

//批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式
function batch_update($table_name='',$data=array(),$field=''){
if(!$table_name||!$data||!$field){
return false;
}else{
$sql='UPDATE '.$table_name;
}
$con=array();
$con_sql=array();
$fields=array();
foreach ($data as $key => $value) {
$x=0;
foreach ($value as $k => $v) {
if($k!=$field&&!$con[$x]&&$x==0){
$con[$x]=" set {$k} = (CASE {$field} ";
}elseif($k!=$field&&!$con[$x]&&$x>0){
$con[$x]=" {$k} = (CASE {$field} ";
}
if($k!=$field){
$temp=$value[$field];
$con_sql[$x].= " WHEN '{$temp}' THEN '{$v}' ";
$x++;
}
}
$temp=$value[$field];
if(!in_array($temp,$fields)){
$fields[]=$temp;
} 
}
$num=count($con)-1;
foreach ($con as $key => $value) {
foreach ($con_sql as $k => $v) {
if($k==$key&&$key<$num){
$sql.=$value.$v.' end),';
}elseif($k==$key&&$key==$num){
$sql.=$value.$v.' end)';
}
}
}
$str=implode(',',$fields);
$sql.=" where {$field} in({$str})";
$res=M($table_name)->execute($sql);
return $res;
}
//测试
function test(){
$update_array=array();
for ($i=2; $i <7 ; $i++) { 
$data=array();
$data['id']=$i;
$data['memeber_type']=2;
$data['memeber_type_state']=1;
$update_array[]=$data;
}
$res=$this->batch_update('yl_member',$update_array,id);
var_dump($res);
}

方法二:

即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。

那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

UPDATE categories 
SET display_order = CASE id 
WHEN 1 THEN 3 
WHEN 2 THEN 4 
WHEN 3 THEN 5 
END
WHERE id IN (1,2,3)

这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

如果更新多个值的话,只需要稍加修改:

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)

实际运用

$display_order = array( 
1 => 4, 
2 => 1, 
3 => 2, 
4 => 3, 
5 => 9, 
6 => 5, 
7 => 8, 
8 => 9 
); 
$ids = implode(',', array_keys($display_order)); 
$sql = "UPDATE categories SET display_order = CASE id "; 
foreach ($display_order as $id => $ordinal) { 
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); 
} 
$sql .= "END WHERE id IN ($ids)"; 
echo $sql;

方法二不建议使用。

方法三:

/*
* @param $saveWhere :想要更新主键ID数组
* @param $saveData :想要更新的ID数组所对应的数据
* @param $tableName : 想要更新的表明
* @param $saveWhere : 返回更新成功后的主键ID数组
* */
public function saveAll($saveWhere,&$saveData,$tableName){
if($saveWhere==null||$tableName==null)
return false;
//获取更新的主键id名称
$key = array_keys($saveWhere)[0];
//获取更新列表的长度
$len = count($saveWhere[$key]);
$flag=true;
$model = isset($model)?$model:M($tableName);
//开启事务处理机制
$model->startTrans();
//记录更新失败ID
$error=[];
for($i=0;$i<$len;$i++){
//预处理sql语句
$isRight=$model->where($key.'='.$saveWhere[$key][$i])->save($saveData[$i]);
if($isRight==0){
//将更新失败的记录下来
$error[]=$i;
$flag=false;
}
//$flag=$flag&&$isRight;
}
if($flag ){
//如果都成立就提交
$model->commit();
return $saveWhere;
}elseif(count($error)>0&count($error)<$len){
//先将原先的预处理进行回滚
$model->rollback();
for($i=0;$i<count($error);$i++){
//删除更新失败的ID和Data
unset($saveWhere[$key][$error[$i]]);
unset($saveData[$error[$i]]);
}
//重新将数组下标进行排序
$saveWhere[$key]=array_merge($saveWhere[$key]);
$saveData=array_merge($saveData);
//进行第二次递归更新
$this->saveAll($saveWhere,$saveData,$tableName);
return $saveWhere;
}
else{
//如果都更新就回滚
$model->rollback();
return false;
}
}

在测试方法中调用:

public function test(){
//要更新的数据表的主键数组
$where['ID']=array(70,73,74,80,83);
//ID主键数组对应的待更新数据
$save=array(
array('School'=>'DK Univisity01','isExport'=>0),
array('School'=>'DK Univisity02','isExport'=>0),
array('School'=>'DK Univisity03','isExport'=>0),
array('School'=>'DK Univisity04','isExport'=>0),
array('School'=>'','isExport'=>0),
// array('School'=>' Univisity05','isExport'=>0),
);
$f=$this->saveAll($where,$save,'want');
if(count($f['ID'])>0){
//返回更新成功的ID数组
echo "This is success :</br>";
dump($f);
echo 'ok';
}else{
//更新失败操作
echo "This is failed :</br>";
dump($f);
echo 'error';
}
}

以上所述是小编给大家介绍的Thinkphp批量更新数据的方法汇总,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
php获取apk包信息的方法
Aug 15 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
php自定义分页类完整实例
Dec 25 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
PHP区块查询实现方法分析
May 12 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 PHP
PHP7 foreach() 函数修改
Mar 09 PHP
ThinkPHP实现更新数据实例详解(demo)
Jun 29 #PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 #PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 #PHP
php mysqli查询语句返回值类型实例分析
Jun 29 #PHP
thinkphp框架实现数据添加和显示功能
Jun 29 #PHP
thinkphp框架实现删除和批量删除
Jun 29 #PHP
浅谈PHP值mysql操作类
Jun 29 #PHP
You might like
php xml常用函数的集合(比较详细)
2013/06/06 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python变量和字符串详解
2017/04/29 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
django Serializer序列化使用方法详解
2018/10/16 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
国贸专业个人求职信范文
2014/01/08 职场文书
美发活动策划书
2014/01/14 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
信用卡工作证明范本
2015/06/19 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB