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:

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()actionCreateカスタム パラメータを許可するように API を修正するにはどうすればよいですか?

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。それ以外の場合は、テーブル内の対応する行を更新します(通常、レコードがこれらの「find」メソッドの1つを使用して取得された場合)。

あなたがしなければならないのは、あなたが使用できるように特定のフィールドを更新することです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 に答える