- 拼接函數
使用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",
]
]
];