php批量更新方法 saveALL

SQL语句:

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'
    ENDWHERE id IN (1,2,3)


批量更新只适用于一个字段的更新,原理是用自定义函数拼接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.     }


添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。