一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - Thinkphp批量更新數據的方法匯總

Thinkphp批量更新數據的方法匯總

2021-01-30 18:00PHP教程網 PHP教程

這篇文章主要介紹了Thinkphp批量更新數據的方法匯總的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99热国产在线 | 校园春色偷拍自拍 | 丁香婷婷在线视频 | 岛国片免费观看 | 国产自在线观看 | 无码专区aaaaaa免费视频 | 91香蕉国产在线观看免费永久 | 美女秘密网站 | 四虎在线视频免费观看视频 | 国产成人精品实拍在线 | 亚洲欧美日韩国产一区图片 | 小舞丝袜调教喷水沦为肉奴 | 丁香五香天堂 | 高清一区二区 | 无限韩国视频免费播放 | 亚洲一区二区三区免费视频 | 我把寡妇日出水好爽 | 国产九九热视频 | 美女张开大腿让男人桶 | 加勒比一本大道香蕉在线视频 | 视频在线视频免费观看 | 四虎免费在线观看 | 国产欧美综合一区二区 | 亚洲午夜大片 | 丝瓜视频黄瓜视频 | 热99精品视频 | 精品国产免费观看一区高清 | 久久WWW免费人成一看片 | 成人性生交大片免费看软件 | 日韩视频在线免费观看 | 99看视频 | 思久久 | 国产成人精品日本亚洲网站 | 日韩资源 | 国产成人永久免费视 | 久久人妻少妇嫩草AV无码 | 国产免费久久精品44 | 久久 这里只精品 免费 | 国产全部理论片线观看 | 四虎影视免费 | 国产91一区二区在线播放不卡 |