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 相关文章推荐
PHP中创建并处理图象
Oct 09 PHP
支持php4、php5的mysql数据库操作类
Jan 10 PHP
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
php生成xml简单实例代码
Dec 16 PHP
计算php页面运行时间的函数介绍
Jul 01 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 PHP
PHP http请求超时问题解决方案
Nov 13 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
php与js的区别是什么
2013/08/05 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
使用angular写一个hello world
2015/01/23 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
详解python中@的用法
2019/03/27 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Keras实现DenseNet结构操作
2020/07/06 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
会展中心部门工作职责
2013/11/27 职场文书
开工仪式主持词
2014/03/20 职场文书
双拥工作宣传标语
2014/06/26 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python