更新特定属性或字段

时间:2012-11-01 06:28:57

标签: php yii

问题1:

当我尝试save()任何Yii模型时,更新行中的所有字段。 问题是:当我尝试保存模型用户时,即使没有要更新的PASSWORD,它也会获得数据库值(已经哈希)并再次哈希。 我怎样才能让YII只更新我想要的字段?

代码:

$user = Users::model()->findByAttributes(array('username'=>$this->username));
$user->ip = $_SERVER['REMOTE_ADDR'];
$user->save();

Users.php(型号):

public function beforeSave() {
    if (!empty($this->password))
        $this->password=$this->hashPassword($this->password);
    return true;
}

问题2:

我有一个可以创建USERS的API。 API教程:http://www.yiiframework.com/wiki/175/how-to-create-a-rest-api/

当我在数据库中使用crypter_password而不是密码时,我收到错误:Parameter password is not allowed for model Users,因为API使用$model->hasAttribute()验证参数。 如何修复API actionCreate以允许自定义参数?

3 个答案:

答案 0 :(得分:1)

根据Yii的文件:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail

public boolean save(boolean $runValidation=true, array $attributes=NULL)

$ attributes - array - 需要保存的属性列表。默认为null,表示将保存从DB加载的所有属性。

您可以传入要保存的字段数组。

答案 1 :(得分:0)

如果Save ()属性为isNewRecord,则

true会在数据库表中插入一行。否则,它将更新表格中的相应行(通常情况下,如果使用其中一种' find'方法获取记录。)

您需要做的是更新特定字段,以便您可以使用SaveAttributes并接受已更新的字符串值数组,例如演示代码如下

$user = Users::model()->findByAttributes(array('username'=>$this->username));
$user->ip = $_SERVER['REMOTE_ADDR'];
$user->SaveAttributes(array('ip'));

答案 2 :(得分:0)

尽管此处列出的其他答案没有错,但它们绝对不是开发人员友好的,并且很容易忘记将属性添加到保存行。

这是一种开发人员友好的工作方式。

在您的模型中,添加以下属性:

private $_aAttributesBackup;

在此变量中,我们将存储当前模型的精确副本。为此,需要添加以下afterFind方法:

public function afterFind()
{
    $this->_aAttributesBackup = $this->attributes;
}

几乎就在那里。此时,模型将其所有属性存储在attributesBackup字段中,这使得比较更容易。为了简化操作,我们还需要一种方法来检查指定的属性是否具有备份值。我们通过在模型中添加以下代码来实现此目的:

public function getOriginalAttribute($sAttribute)
{
    if ($this->_aAttributesBackup)
    {
        return $this->_aAttributesBackup[$sAttribute];
    }

    return NULL;
}

现在,如何检查密码是否已更改?简单,通过添加以下beforeSave代码:

public function beforeSave()
{
    if ($this->getOriginalAttribute('password') != $this->password)
    {
        $this->password = sha1($this->password);
    }
    return parent::beforeSave();
}

Et瞧。现在每次执行代码$ Model-> save();系统将检查密码是否已更改,如果密码更改,它将再次哈希,如果没有更改,则不会再次进行哈希处理。