以下小編給大家列出了三種實現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批量更新數據的方法匯總,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!