Sfoglia il codice sorgente

优化批量修改逻辑

林海涛 1 anno fa
parent
commit
475ac90063
1 ha cambiato i file con 26 aggiunte e 14 eliminazioni
  1. 26 14
      app/common/model/BaseModel.php

+ 26 - 14
app/common/model/BaseModel.php

@@ -56,31 +56,43 @@ class BaseModel extends Model
 
     /**
      * 批量更新字段
+     * [1 => ['filed1' => 'value1','filed2'=>'value2'],2=> ['filed1'=>'value1']] key为ID主键
      * 获取DB 对象并赋予 模型本身的 connection 连接
      * @return mixed
      */
 
-    public static function updateWhenCase($datas)
+    public static function updateWhenCase(array $dataMap)
     {
-        if(is_array($datas) && count($datas) > 0 ){
-            $ids = array_keys($datas);
-            if(is_array(reset($datas))){
-                $fields = array_keys(reset($datas));
-                $sql= " update ". self::getDb() ." set ";
-                foreach($fields as $field ){
-                    $sql.= " `$field` = ( case id";
-                    foreach($datas as $id => $data ){
-                        $sql.= " when $id then ".self::stringFilter($data[$field])." ";
+        if(is_array($dataMap) && count($dataMap) > 0 ) {
+            // 构建 SQL 语句
+            $sql = "UPDATE " . self::getDb() . " SET ";
+            $uniqueFieldValues = [];
+            foreach ($dataMap as $id => $data) {
+                foreach ($data as $field => $value) {
+                    if (!isset($uniqueFieldValues[$field])) {
+                        $uniqueFieldValues[$field] = [];
                     }
-                    $sql.= " end ),";
+                    $uniqueFieldValues[$field][] = ['id' => $id, 'value' => $value];
                 }
-                $sql = substr($sql,0,-1);
-                $sql.= " where id in (".implode(",",$ids).")";
-                Db::execute($sql);
             }
+            $placeholders = [];
+            foreach ($uniqueFieldValues as $field => $data) {
+                $str = " `$field` = CASE id ";
+                foreach ($data as $value) {
+                    $str .= " WHEN {$value['id']} THEN " . self::stringFilter($value['value']);
+                }
+                $str .= " ELSE " . $field . " END";
+                $placeholders[] = $str;
+            }
+            $sql .= implode(', ', $placeholders);
+            $sql .= " where id in (" . implode(",", array_keys($dataMap)) . ")";
+            // 执行 SQL 语句
+            Db::execute($sql);
         }
     }
 
+
+
     public static function stringFilter($string)
     {
         if(is_null($string)) {