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;
}
太耗時?爲什麼?時間到底在哪裏消費? – Jon 2013-05-02 11:10:51
無法執行任何CRUD語句「組合」或無需擁有另一個CRUD語句。你不能對數據庫說'通過更新一個不存在的'在表中創建一個新記錄'。你不能混淆'INSERT INTO
回答
工作你想以同樣的方式。如果模型是新的,它將插入,如果模型存在,它將更新。 http://www.yiiframework.com/doc/guide/1.1/en/database.ar#updating-record
來源
2013-05-02 11:09:01 Hemc
不幸的是,模型 - >保存將保存每條記錄,並且不會更新,因爲我每次循環並創建一個新模型....但基於這裏的答案,我明白這是我必須做的。 – 2013-05-02 11:34:41
如果您確定它是現有的模型,您可以將isNewRecord設置爲false。然後save()將執行更新。 或者使用ActiveRecord :: update()方法。但是,你將不會再驗證。 – Sisko78 2013-05-03 12:56:50
@DannyValariola它每次都會插入,因爲在數據庫中沒有唯一的密鑰,或者它會如何知道模型存在。 – 2015-09-29 12:33:29
無需做任何事情
$模型 - > isNewRecord將檢查記錄是新的或不前執行查詢。
所以$模型 - >保存將創造新的記錄,如果$模型 - > isNewRecord返回「真」,
就像它返回「false」 $模型 - >保存將更新相對於記錄主鍵。
來源
2015-08-06 07:47:37
相關問題