首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii 批量插入數據的兩種高效實作方案

     編輯:PHP 相關知識

Yii 批量插入數據的兩種高效實作方案

在 Yii 框架中處理大量數據寫入時,直接在迴圈中呼叫 insert() 或 save() 往往會遇到「只插入第一條」或「只插入最後一條」的問題。這是因為 ActiveRecord 實例在首次插入後,isNewRecord 會被設為 false,導致後續操作變成更新而非插入。本文提供兩種經實測可行的解決方案。

問題重現

$user = array(
    0 => array('id'=>1, 'name'=>'張三'),
    1 => array('id'=>2, 'name'=>'李四'),
);

foreach ($user as $data) {
    $model = new User();
    $model->attributes = $data;
    $model->insert(); // 僅第一條成功
    // 或 $model->save(); // 僅最後一條成功
}

方案一:每次迴圈 Clone 全新模型實例

透過 clone 關鍵字複製一個乾淨的模型物件,確保每次插入都是新記錄:

$model = new User();
foreach ($data as $attributes) {
    $_model = clone $model;          // 複製實例
    $_model->setAttributes($attributes);
    $_model->save();                 // 每次都是新記錄
}

方案二:重置 isNewRecord 與主鍵值

在同一模型實例上,手動將 isNewRecord 設回 true 並清空主鍵:

$model = new User();
foreach ($data as $attributes) {
    $model->isNewRecord = true;      // 標記為新記錄
    $model->setAttributes($attributes);
    $model->save() && $model->id = 0; // 存檔後重置主鍵
}

補充建議

  • 若數據量極大(數萬筆以上),建議改用 Yii::app()->db->createCommand() 批量構建 SQL,或使用 batchInsert()(Yii 1.1.14+ 支援)以獲得最佳效能。
  • 搭配事務(transaction)可確保數據一致性。
  • 插入前務必呼叫 validate() 進行驗證,避免髒數據入庫。

掌握這兩種模式,即可在 Yii 專案中靈活、高效地完成批量寫入需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved