關於Yii2批量更新的操作
有時候需要更新一個表裏面很多字段,用內置方法update更新可能還算適用
內置方法如下:
Yii::$app->db->createCommand()->update($table, $columns, $condition = '')->execute();
第一個是表,第二個修改字段 ,第三個是條件
實例:
Yii::$app->db->createCommand()->update(User::tableName(), ['user_state' => '1'], "user_name='{$info['user_id']}'")->execute();
但是滿足不了特定的情況,如:數據庫包含順序標識sort字段,在刪除其中一條數據後,要把之後的數據sort字段進行減1。
這樣一來更新內置方法就無法適用了,目前也沒找到類似的內置方法(有的話歡迎評論)部分開發會使用循環來更新,因爲這樣的數據都不會過超過一百條,所有循環還算適用,但是有什麼辦法只執行一次更新操作嗎?當然有,我們可以使用原生的SQL語句拼接操作!!爲了方便使用,我將它寫成一個函數,代碼如下:
/**
* @param $table string 表名
* @param $key string 條件主鍵,作用參考switch中的case
* @param $val self 修改主鍵
* @param $data array $key與$val主鍵對應的數據載體
* @return string 批量更新SQL
*/
public function batchUpdate($table, $key, $val, $data){
$ids = implode(",", array_column($data, $key));
$condition = " ";
foreach ($data as $v){
$condition .= "WHEN {$v[$key]} THEN {$v[$val]} ";
}
$sql = "UPDATE `{$table}` SET {$val} = CASE {$key} {$condition} END WHERE {$key} in ({$ids})";
return $sql;
}
調用實例:
$data = [["user_id"=>1,"sort"=>1],["user_id"=>4,"sort"=>2],["user_id"=>5,"sort"=>3]];
$sql = $this->batchUpdate("user", "user_id", "sort", $data);
$res = Yii::$app->db->createCommand($sql)->execute();
如果有更好的主意,歡迎評論討論~