關於Yii2批量更新的操作

關於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();

如果有更好的主意,歡迎評論討論~

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