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",
                    ]
                ]
            ];

 

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