2

问题1:

当我尝试使用save()任何 Yii 模型时,它会更新行中的所有字段。问题是:当我尝试保存模型用户时,即使没有要更新的密码,它也会获取数据库值(已经散列)并再次散列。我怎样才能对 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:

我有一个可以创建用户的 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(). 如何修复 APIactionCreate以允许自定义参数?

4

3 回答 3

1

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

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

$attributes - 数组 - 需要保存的属性列表。默认为 null,这意味着将从 DB 加载的所有属性都将被保存。

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

于 2012-11-01T06:35:32.537 回答
0

Save ()isNewRecord如果属性为,则在数据库表中插入一行true。否则,它将更新表中的相应行(通常是使用这些“查找”方法之一获取记录的情况。)

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

$user = Users::model()->findByAttributes(array('username'=>$this->username));
$user->ip = $_SERVER['REMOTE_ADDR'];
$user->SaveAttributes(array('ip'));
于 2012-11-01T06:35:48.203 回答
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();
}

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

于 2012-11-01T07:51:49.787 回答