簡體   English   中英

如何使用 Yii2 ActiveRecord 更新多行?

[英]How to update multiple rows with Yii2 ActiveRecord?

我有 2 個填充有值的表:

`users`
id | name | account_id | card_id

`cards` 
id | name | account_id

現在我需要從users獲取所有值。 card_idcards查找cards中的所有記錄。 id = users card_id ,然后從account_id的表cards值中獲取這些記錄並更新users account_id與這些值。 請您告訴我使用 Yii2 和 Active Record 的正確方法嗎?

我的代碼:

class CodeController
{
    public function actionGo()
    {

    $cardsIdsFromUsers = Users::find()
        ->select('card_id')
        ->column();

    $accountsFromCards = Cards::find()
        ->where(['id' => $cardsIdsFromUsers])
        ->all();

    foreach($accountsFromCards as $account){
        $user = Users::find()
            ->where(['card_id' => $account->id])
            ->one();

        $user->account_id = $account->account_id;
        $user->update();
        }
    }
} 

此代碼有效,但兩個表中都有 20k 行,並且代碼運行速度非常慢。 另外,我知道我的代碼遠非最佳,所以請提供建議如何使它正確。

您可以使用\yii\db\ConnectioncreateCommand()方法在兩個表上創建更新,如下所示

$command = \Yii::$app->db->createCommand(
    'UPDATE users, cards SET users.account_id = cards.account_id WHERE cards.id = users.card_id'
);
$command->execute();

這只有在這兩個表之間的關系是 1:1 時才能正常工作。

但是你應該問自己兩個問題:

1) 你真的需要在兩個表中都保存 account_id 嗎? 數據冗余通常是個壞主意,因為它會引發一些一致性問題。

2)這兩個表中的一個卡ID的account_id可以不同嗎? 如果帳戶 id 應該始終相同,那么您應該考慮使用triggers 當一個表中的 account_id 更改時,觸發器將更新另一個表,而不是偶爾更新所有表。

更新:在下面的評論中,已澄清表位於同一 MySQL 服務器上的不同數據庫中,單個數據庫用戶可訪問。

如果 mysql 用戶可以訪問這兩個表,則只需在表名前加上數據庫名稱,就可以對不同數據庫中的兩個表執行 UPDATE 查詢。 假設Yii::$app->db中的連接設置為可以訪問兩個數據庫的用戶,代碼將如下所示:

$command = \Yii::$app->db->createCommand(
    'UPDATE db1.users, db2.cards SET users.account_id = cards.account_id WHERE cards.id = users.card_id'
);
$command->execute();

注意: SQL 命令中的 db1 和 db2 應替換為包含表的數據庫的實際名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM