2013-05-02 102 views
1

我有一個非常重要的系統,儘可能接近實時。 出於這個原因,當我從外部源獲取數據我想用$模型 - >更新,而不是執行2個查詢:Yii即使記錄是新的,如何使用模型更新

$model->find() 
if(new) 
    $model->save 
else 
    $model->update 

這太耗費時間...我可以使用$模型 - >更新,如果記錄是新的,它會簡單地創建它?

我看了更新的代碼,但我不知道如何覆蓋它。

public function update($attributes=null) 
{ 
    if($this->getIsNewRecord()) 
     throw new CDbException(Yii::t('yii','The active record cannot be updated because it is new.')); 
    if($this->beforeSave()) 
    { 
     Yii::trace(get_class($this).'.update()','system.db.ar.CActiveRecord'); 
     if($this->_pk===null) 
      $this->_pk=$this->getPrimaryKey(); 
     $this->updateByPk($this->getOldPrimaryKey(),$this->getAttributes($attributes)); 
     $this->_pk=$this->getPrimaryKey(); 
     $this->afterSave(); 
     return true; 
    } 
    else 
     return false; 
} 
+0

太耗時?爲什麼?時間到底在哪裏消費? – Jon 2013-05-02 11:10:51

+0

無法執行任何CRUD語句「組合」或無需擁有另一個CRUD語句。你不能對數據庫說'通過更新一個不存在的'在表中創建一個新記錄'。你不能混淆'INSERT INTO

'與'UPDATE
WHERE'。您受到常規數據庫查詢語言的限制。但是:正如下面的答案中所述,http:// stackoverflow.com/a/16336521/431967'你可以做$ model-> save()。 – Highmastdon2013-05-02 11:28:42

回答

4
$model->save 

工作你想以同樣的方式。如果模型是新的,它將插入,如果模型存在,它將更新。 http://www.yiiframework.com/doc/guide/1.1/en/database.ar#updating-record

正如我們可以看到,我們使用相同的保存()方法執行插入和更新 操作。如果使用新的 運算符創建AR實例,調用save()將在數據庫 表中插入新行;如果AR實例是某個find或findAll方法調用的結果,則調用save()將更新表中的現有行。

+0

不幸的是,模型 - >保存將保存每條記錄,並且不會更新,因爲我每次循環並創建一個新模型....但基於這裏的答案,我明白這是我必須做的。 – 2013-05-02 11:34:41

+1

如果您確定它是現有的模型,您可以將isNewRecord設置爲false。然後save()將執行更新。 或者使用ActiveRecord :: update()方法。但是,你將不會再驗證。 – Sisko78 2013-05-03 12:56:50

+0

@DannyValariola它每次都會插入,因爲在數據庫中沒有唯一的密鑰,或者它會如何知道模型存在。 – 2015-09-29 12:33:29

1

無需做任何事情

$模型 - > isNewRecord將檢查記錄是新的或不前執行查詢。

所以$模型 - >保存將創造新的記錄,如果$模型 - > isNewRecord返回「真」,

就像它返回「false」 $模型 - >保存將更新相對於記錄主鍵。