PHP 不同主鍵數據批量更新(支持聯合主鍵)

  • 拼接函數

使用WHEN THEN進行SQL語句拼接,實現不同主鍵數據批量更新(支持聯合主鍵)

    public static function updateBatch($tableName = "", $multipleData = array()){

        //$tableName = env("DB_PREFIX").$tableName;
        if( $tableName && !empty($multipleData) ) {

            $updateColumn = array_keys($multipleData[0][1]);
            $referenceColumn = array_keys($multipleData[0][0]);
            $referenceColumnString = "(";
            foreach ($referenceColumn as $value => $item){
                $referenceColumnString .= "`".$item."`";
                if($value!=count($referenceColumn)-1)
                    $referenceColumnString .=",";

            }
            $referenceColumnString .= ")";
            $referenceColumnStringEnd = $referenceColumn[count($referenceColumn)-1];


            $whereIn = "";

            $q = "UPDATE ".$tableName." SET ";
            foreach ( $updateColumn as $uColumn ) {
                $q .=  $uColumn." = CASE ";


                foreach( $multipleData as $data ) {
                    $referenceColumnStringValue = "(";

                    foreach ($data[0] as $value => $item) {
                        $referenceColumnStringValue .= "'".$item."'";
                        if($value!=$referenceColumnStringEnd)
                            $referenceColumnStringValue .=",";
                    }
                    $referenceColumnStringValue .= ")";

                    $q .= "WHEN ".$referenceColumnString." = ".$referenceColumnStringValue.
                        " THEN '".$data[1][$uColumn]."' ";
                }
                $q .= "ELSE ".$uColumn." END, ";
            }
            foreach( $multipleData as $data ) {
                $whereIn .= "(";
                foreach ($data[0] as $value => $item) {
                    $whereIn .= "'".$item."'";
                    if($value!=$referenceColumnStringEnd)
                        $whereIn .=",";
                }
                $whereIn .= ")";
                $whereIn .= ",";
            }
            $q = rtrim($q, ", ")." WHERE ".$referenceColumnString." IN (".  rtrim($whereIn, ', ').")";

            // Update
            return DB::update(DB::raw($q));

        } else {
            return false;
        }

    }
  • 調用方法

方法第一個參數$tableName是數據表名稱。第二個參數$multipleData是修改的數據,該參數需要特殊的數據結構,不過結構比較清晰和簡單。數據結構實際上是一個數組,該數組中的每一個子數組表示每一條需要修改的數據,而該子數組下的兩個數組:第一個數組表示主鍵(單個主鍵時只有一條數據),第二個數組表示需要修改的數據。

具體如下:

        $testColor =
            [
                [//這個數組表示每一條需要更新的數據
                    [//這個數組表示主鍵
                        "super_color" => "123sdaffsad4",
                        "color_name" => "name1",
                    ],
                    [//這個數組表示更新的內容
                        "test" => "asjkldhflqwer",
                    ]
                ],
                [
                [
                    "super_color" => "123sdaffsad4",
                    "color_name" => "name1231",
                ],
                    [
                        "test" => "asjkldhflqwer",
                    ]
                ]
            ];

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章