php-特定の属性またはフィールドを更新します
問題1:
Yiiモデルをsave()
しようとすると、行のすべてのフィールドが更新されます。
問題は次のとおりです。モデルユーザーを保存しようとすると、更新するパスワードがなくても、データベース値(ハッシュ済み)を取得して再度ハッシュします。
必要なフィールドのみを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
を修正してカスタムパラメータを許可するにはどうすればよいですか?
答え :
解決策:
Yiiのドキュメントによると: http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail
public boolean save(boolean $runValidation=true, array $attributes=NULL)
$attributes-配列-保存する必要のある属性のリスト。デフォルトはnullです。これは、DBからロードされるすべての属性が保存されることを意味します。
保存するフィールドの配列を渡すことができます。
答え :
解決策:
ここにリストされている他の回答は間違いではありませんが、開発者にとっては間違いなくフレンドリーではなく、保存行に属性を追加するのを忘れがちです。
これが開発者にとって使いやすい作業方法です。
モデルに次の属性を追加します:
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();システムは、パスワードが変更されたかどうかを確認します。パスワードが変更された場合は再度ハッシュされ、変更されていない場合は再度ハッシュされません。
答え :
解決策:
Save ()
は、 isNewRecord
プロパティが<の場合、データベーステーブルに行を挿入します。 code> true。それ以外の場合は、テーブル内の対応する行を更新します(通常、レコードがこれらの「find」メソッドの1つを使用して取得された場合)
特定のフィールドを更新して、 SaveAttributes
を使用できるようにする必要があります。これにより、たとえば更新された文字列値の配列が受け入れられます。デモコードは次のとおりです
$ user = Users :: model()-> findByAttributes(array('username' => $ this-> username));
$ user-> ip = $ _SERVER ['REMOTE_ADDR'];
$ user-> SaveAttributes(array('ip'));
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。