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