以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步!
方法一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
//批量修改 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并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。
1
2
3
4
5
6
7
|
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行数据执行。
如果更新多个值的话,只需要稍加修改:
1
2
3
4
5
6
7
8
9
10
11
12
|
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)
|
实际运用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$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 ;
|
方法二不建议使用。
方法三:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/*
* @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;
}
}
|
在测试方法中调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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批量更新数据的方法汇总,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!