[英]How to update multiple rows with Yii2 ActiveRecord?
我有 2 個填充有值的表:
`users`
id | name | account_id | card_id
`cards`
id | name | account_id
現在我需要從users
獲取所有值。 card_id
列cards
查找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\Connection
的createCommand()
方法在兩個表上創建更新,如下所示
$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.