以下小编给大家列出了三种实现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批量更新数据的方法汇总,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!