Thinkphp 批量更新方法 saveALL


批量更新只適用於一個字段的更新,原理是用自定義函數拼接sql語句,然后再執行sql語句.

 

  

  1. //數據
  2. $data[] = array('id'=>1,'value'=>value1);
  3. $data[] = array('id'=>2,'value'=>value2);
  4. $data[] = array('id'=>3,'value'=>value3);
  5. $this->saveAll($data,表名);

  

  1. //生成的sql語句結構
  2. UPDATE categories
  3.     SET display_order = CASE id
  4.         WHEN 1 THEN 3
  5.         WHEN 2 THEN 4
  6.         WHEN 3 THEN 5
  7.     END
  8. WHERE id IN (1,2,3)

 

  1. //批量更新
  2.     public function saveAll($datas,$model){
  3.         $model || $model=$this->name;
  4.         $sql   = ''; //Sql
  5.         $lists = []; //記錄集$lists
  6.         $pk    = $this->getPk();//獲取主鍵
  7.         foreach ($datas as $data) {
  8.             foreach ($data as $key=>$value) {
  9.                 if($pk===$key){
  10.                     $ids[]=$value;
  11.                 }else{
  12.                     $lists[$key].= sprintf("WHEN %u THEN '%s' ",$data[$pk],$value);
  13.                 }
  14.             }
  15.         }
  16.         foreach ($lists as $key => $value) {
  17.             $sql.= sprintf("`%s` = CASE `%s` %s END,",$key,$pk,$value);
  18.         }
  19.         $sql = sprintf('UPDATE __%s__ SET %s WHERE %s IN ( %s )',strtoupper($model),rtrim($sql,','),$pk,implode(',',$ids));
  20.         return M()->execute($sql);
  21.     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM