Thinkphp怎么批量更新数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thinkphp怎么批量更新数据相关的知识,希望对你有一定的参考价值。
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\';
参考技术A $MODEL->where(条件)->save();
批量更新和单条更新的区别就是条件不同而已。
$MODEL->where(array('id'=>5))->save(); // 单条 id为5的数据
$MODEL->where(array('status'=>0))->save(); // 多条 状态为0的数据
thinkphp的save方法
thinkphp的save方法为什么数据一直是更新失败的,这错误在哪?
是否是表单提交的数据,不是就修改追问是数据库问题,已经解决了,感谢
追答数据库什么原因?TP几3.2.3?
追问是表的主键要添加进去,tp3.2
追答嗯
参考技术A 你更新数据库怎么用这个方法?追问thinkphp数据更新不是这个方法么?
追答不是啊 upload
追问不是吧
这个是thinkphp
以上是关于Thinkphp怎么批量更新数据的主要内容,如果未能解决你的问题,请参考以下文章