最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Thinkphp批量更新數(shù)據(jù)的方法匯總

 更新時(shí)間:2016年06月29日 17:18:05   投稿:mrr  
這篇文章主要介紹了Thinkphp批量更新數(shù)據(jù)的方法匯總的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

以下小編給大家列出了三種實(shí)現(xiàn)thinkphp批量更新數(shù)據(jù)的方法,寫的不好還請(qǐng)見諒,有意見歡迎提出,共同學(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并沒有提供直接的方法來實(shí)現(xiàn)批量更新,但是可以用點(diǎn)小技巧來實(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){
//將更新失敗的記錄下來
$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ì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Laravel如何同時(shí)連接多個(gè)數(shù)據(jù)庫(kù)詳解

    Laravel如何同時(shí)連接多個(gè)數(shù)據(jù)庫(kù)詳解

    這篇文章主要給大家介紹了關(guān)于Laravel如何同時(shí)連接多個(gè)數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • ThinkPHP文件緩存類代碼分享

    ThinkPHP文件緩存類代碼分享

    本文給大家分享的是取自ThinkPHP中的關(guān)于文件緩存類的代碼,非常的實(shí)用,效率也非常不錯(cuò),這里推薦給大家,有需要的小伙伴參考下。
    2015-04-04
  • 基于linnux+phantomjs實(shí)現(xiàn)生成圖片格式的網(wǎng)頁(yè)快照

    基于linnux+phantomjs實(shí)現(xiàn)生成圖片格式的網(wǎng)頁(yè)快照

    在代碼區(qū)看到一個(gè)生成站點(diǎn)快照的代碼,看了半天才發(fā)現(xiàn),作者僅僅貼出來業(yè)務(wù)代碼,最核心的生成快照?qǐng)D片的代碼反而沒有給出來。 以前記得google搜索提供站點(diǎn)縮略圖,那時(shí)候覺得好神奇,但是沒有花時(shí)間去做深入的調(diào)研。昨天又遇到了,那就順便調(diào)研下吧。
    2015-04-04
  • 萬(wàn)能的php分頁(yè)類

    萬(wàn)能的php分頁(yè)類

    這篇文章主要為大家詳細(xì)介紹了萬(wàn)能的php分頁(yè)類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 采用thinkphp自帶方法生成靜態(tài)html文件詳解

    采用thinkphp自帶方法生成靜態(tài)html文件詳解

    thinkphp本身自帶了一個(gè)有效的生成靜態(tài)頁(yè)的方法,這篇文章主要介紹了采用thinkphp自帶方法生成靜態(tài)html文件
    2014-06-06
  • Docker搭建自己的PHP開發(fā)環(huán)境

    Docker搭建自己的PHP開發(fā)環(huán)境

    本文給大家介紹的是如何在docker中搭建一個(gè)PHP的開發(fā)環(huán)境,將用 zPhal-dockerfiles 做為例子,有需要的小伙伴可以參考下
    2018-02-02
  • php header函數(shù)的常用http頭設(shè)置

    php header函數(shù)的常用http頭設(shè)置

    這篇文章主要介紹了php header函數(shù)的常用http頭設(shè)置,本文直接給出代碼實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-06-06
  • PHP編寫daemon process詳解及實(shí)例代碼

    PHP編寫daemon process詳解及實(shí)例代碼

    這篇文章主要介紹了PHP編寫daemon process詳解的相關(guān)資料,并附實(shí)例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • 單點(diǎn)登錄 Ucenter示例分析

    單點(diǎn)登錄 Ucenter示例分析

    正如標(biāo)題所言,需要了解下Ucenter登錄步驟,之后在進(jìn)行有效的分析,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下
    2013-10-10
  • php分頁(yè)思路以及在Zend?Framework框架中的使用

    php分頁(yè)思路以及在Zend?Framework框架中的使用

    php分頁(yè)思路以及在Zend?Framework框架中的使用,需要的朋友可以參考下
    2012-05-05

最新評(píng)論

沁源县| 新乡市| 科技| 云和县| 德保县| 高尔夫| 乳山市| 西林县| 贵州省| 白山市| 红桥区| 资阳市| 绥棱县| 岑溪市| 邹城市| 黄石市| 康平县| 汉寿县| 张家川| 普陀区| 渝北区| 贡山| 石屏县| 丰镇市| 冷水江市| 陆河县| 枣强县| 临安市| 安吉县| 新安县| 图木舒克市| 平舆县| 顺昌县| 克什克腾旗| 依兰县| 金平| 五大连池市| 澄城县| 长兴县| 育儿| 基隆市|