1

我有一个系统非常重要,它尽可能接近实时。因此,当我从外部源获取数据时,我想使用 $model->update 而不是执行 2 个查询:

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

这太耗时了...我可以使用 $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;
}
4

2 回答 2

4
$model->save

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

如我们所见,我们使用相同的 save() 方法来执行插入和更新操作。如果一个 AR 实例是使用 new 操作符创建的,调用 save() 会在数据库表中插入一个新行;如果 AR 实例是某些 find 或 findAll 方法调用的结果,则调用 save() 将更新表中的现有行。

于 2013-05-02T11:09:01.750 回答
1

无需做任何事情

$model->isNewRecord 将在执行查询之前检查记录是否是新的。

所以如果 $model->isNewRecord 返回“true”,$model->save 将创建新记录,

好像它返回 "false" $model->save 将更新关于 primary key 的记录。

于 2015-08-06T07:47:37.087 回答