问题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
以允许自定义参数?
答案 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();系统将检查密码是否已更改,如果密码更改,它将再次哈希,如果没有更改,则不会再次进行哈希处理。