Thinkphp批量更新數(shù)據(jù)的方法匯總
以下小編給大家列出了三種實(shí)現(xiàn)thinkphp批量更新數(shù)據(jù)的方法,寫的不好還請(qǐng)見(jiàn)諒,有意見(jiàn)歡迎提出,共同學(xué)習(xí)進(jìn)步!
方法一:
//批量修改 data二維數(shù)組 field關(guān)鍵字段 參考ci 批量修改函數(shù) 傳參方式 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; } //測(cè)試 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); }
方法二:
即是循環(huán)一條一條的更新記錄。一條記錄update一次,這樣性能很差,也很容易造成阻塞。
那么能不能一條sql語(yǔ)句實(shí)現(xiàn)批量更新呢?mysql并沒(méi)有提供直接的方法來(lái)實(shí)現(xiàn)批量更新,但是可以用點(diǎn)小技巧來(lái)實(shí)現(xiàn)。
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。
即是將條件語(yǔ)句寫在了一起。
這里的where部分不影響代碼的執(zhí)行,但是會(huì)提高sql執(zhí)行的效率。確保sql語(yǔ)句僅執(zhí)行需要修改的行數(shù),這里只有3條數(shù)據(jù)進(jìn)行更新,而where子句確保只有3行數(shù)據(jù)執(zhí)行。
如果更新多個(gè)值的話,只需要稍加修改:
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)
實(shí)際運(yùn)用
$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數(shù)組 * @param $saveData :想要更新的ID數(shù)組所對(duì)應(yīng)的數(shù)據(jù) * @param $tableName : 想要更新的表明 * @param $saveWhere : 返回更新成功后的主鍵ID數(shù)組 * */ public function saveAll($saveWhere,&$saveData,$tableName){ if($saveWhere==null||$tableName==null) return false; //獲取更新的主鍵id名稱 $key = array_keys($saveWhere)[0]; //獲取更新列表的長(zhǎng)度 $len = count($saveWhere[$key]); $flag=true; $model = isset($model)?$model:M($tableName); //開啟事務(wù)處理機(jī)制 $model->startTrans(); //記錄更新失敗ID $error=[]; for($i=0;$i<$len;$i++){ //預(yù)處理sql語(yǔ)句 $isRight=$model->where($key.'='.$saveWhere[$key][$i])->save($saveData[$i]); if($isRight==0){ //將更新失敗的記錄下來(lái) $error[]=$i; $flag=false; } //$flag=$flag&&$isRight; } if($flag ){ //如果都成立就提交 $model->commit(); return $saveWhere; }elseif(count($error)>0&count($error)<$len){ //先將原先的預(yù)處理進(jìn)行回滾 $model->rollback(); for($i=0;$i<count($error);$i++){ //刪除更新失敗的ID和Data unset($saveWhere[$key][$error[$i]]); unset($saveData[$error[$i]]); } //重新將數(shù)組下標(biāo)進(jìn)行排序 $saveWhere[$key]=array_merge($saveWhere[$key]); $saveData=array_merge($saveData); //進(jìn)行第二次遞歸更新 $this->saveAll($saveWhere,$saveData,$tableName); return $saveWhere; } else{ //如果都更新就回滾 $model->rollback(); return false; } }
在測(cè)試方法中調(diào)用:
public function test(){ //要更新的數(shù)據(jù)表的主鍵數(shù)組 $where['ID']=array(70,73,74,80,83); //ID主鍵數(shù)組對(duì)應(yīng)的待更新數(shù)據(jù) $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數(shù)組 echo "This is success :</br>"; dump($f); echo 'ok'; }else{ //更新失敗操作 echo "This is failed :</br>"; dump($f); echo 'error'; } }
以上所述是小編給大家介紹的Thinkphp批量更新數(shù)據(jù)的方法匯總,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- ThinkPHP多表聯(lián)合查詢的常用方法
- thinkphp實(shí)現(xiàn)like模糊查詢實(shí)例
- ThinkPHP查詢語(yǔ)句與關(guān)聯(lián)查詢用法實(shí)例
- ThinkPHP視圖查詢?cè)斀?/a>
- Thinkphp使用mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)多條件查詢方法
- thinkphp3查詢mssql數(shù)據(jù)庫(kù)亂碼解決方法分享
- ThinkPHP實(shí)現(xiàn)更新數(shù)據(jù)實(shí)例詳解(demo)
- ThinkPHP添加更新標(biāo)簽的方法
- ThinkPHP實(shí)現(xiàn)批量刪除數(shù)據(jù)的代碼實(shí)例
- thinkphp框架實(shí)現(xiàn)刪除和批量刪除
- thinkphp利用模型通用數(shù)據(jù)編輯添加和刪除的實(shí)例代碼
- ThinkPHP框架實(shí)現(xiàn)用戶信息查詢更新及刪除功能示例
相關(guān)文章
Laravel訪問(wèn)出錯(cuò)提示:`Warning: require(/vendor/autoload.php): faile
這篇文章主要介紹了Laravel訪問(wèn)出錯(cuò)提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解決方法,涉及Laravel框架相關(guān)配置與安裝操作技巧,需要的朋友可以參考下2019-04-04PHP分多步驟填寫發(fā)布信息的簡(jiǎn)單方法實(shí)例代碼
有的時(shí)候,在做發(fā)布信息提交頁(yè)面時(shí),需要把很多復(fù)雜信息提交頁(yè)面分成多個(gè)步驟來(lái)提交。下現(xiàn)就是實(shí)現(xiàn)的這種功能的基本方法2012-09-09PHP實(shí)現(xiàn)簡(jiǎn)易圖形計(jì)算器
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)簡(jiǎn)易圖形計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08php遞歸函數(shù)三種實(shí)現(xiàn)方法及如何實(shí)現(xiàn)數(shù)字累加
實(shí)現(xiàn)遞歸函數(shù)有哪些方法呢?如何用遞歸函數(shù)實(shí)現(xiàn)數(shù)字累加?這篇文章就主要介紹php遞歸函數(shù)三種實(shí)現(xiàn)方法及如何實(shí)現(xiàn)數(shù)字累加,需要的朋友可以參考下。2015-08-08淺析php設(shè)計(jì)模式之?dāng)?shù)據(jù)對(duì)象映射模式
php中的設(shè)計(jì)模式中有很多的各種模式了,在這里我們來(lái)為各位介紹一個(gè)不常用的數(shù)據(jù)映射模式吧,感興趣的朋友一起看下吧2016-03-03