在 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 關鍵字複製一個乾淨的模型物件,確保每次插入都是新記錄:
$model = new User();
foreach ($data as $attributes) {
$_model = clone $model; // 複製實例
$_model->setAttributes($attributes);
$_model->save(); // 每次都是新記錄
}
在同一模型實例上,手動將 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 專案中靈活、高效地完成批量寫入需求。