我有一个名为user
的模型。此模型具有password
,media_id
和许多其他属性。
我想使用此方法更改单个属性:
$user = User::find()
->where([
"id" => $id
])
->one();
$user->media_id = null;
if($user->save()){
return [
"ok" => true
];
}
else{
return [
"ok" => false,
"result" => $user->errors
];
}
但是当我运行此代码时,密码字段将更改为未知值,因此用户无法再登录。
但是当我使用以下方法时:
User::updateAll([
"media_id" => null
],
[
"id" => $id
]);
我的查询正常工作。第一个代码有什么问题?
UPDATE1:
这是规则:
public function rules() {
return [
['password', 'required', 'message' => 'لطفا کلمه عبور خود را وارد نمایید', 'on' => 'register'],
['email', 'required', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
['email', 'duplicateEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
['email', 'validateRegisterEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
['email', 'required', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
['email', 'duplicateEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
['email', 'validateRegisterEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
// [['code', 'first_name', 'last_name', 'gender', 'mobile', 'email', 'password', 'bio', 'degree', 'favorites', 'type', 'active', 'active_mobile', 'active_email', 'modified_password', 'created', 'modified', 'deleted'], 'required'],
[['gender', 'media_id', 'cover_media_id', 'type', 'active', 'active_mobile', 'active_email', 'deleted'], 'integer'],
[['degree', 'bio', 'favorites'], 'string'],
[['modified_password', 'created', 'modified'], 'safe'],
[['code'], 'string', 'max' => 10],
[['forget_password_token'], 'string', 'max' => 32],
[['first_name', 'last_name', 'email'], 'string', 'max' => 50, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد'],
[['mobile'], 'string', 'max' => 12, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد'],
[['password'], 'string', 'max' => 20, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد', 'on' => 'register'],
[['media_id'], 'exist', 'skipOnError' => true, 'targetClass' => Media::className(), 'targetAttribute' => ['media_id' => 'id']],
[['cover_media_id'], 'exist', 'skipOnError' => true, 'targetClass' => Media::className(), 'targetAttribute' => ['cover_media_id' => 'id']],
['type', 'default', 'value' => 1],
['type', 'in', 'range' => [self::ROLE_USER, self::ROLE_INSTRUCTOR, self::ROLE_AUTHOR, self::ROLE_MANAGER, self::ROLE_INVESTOR]],
];
}
我已经测试过save(false)
,但仍然更改了密码。
我还测试了model.validate()
,并且密码没有更改。
密码仅在我运行model.save()
时更改。
这是我的model
答案 0 :(得分:2)
public function beforeSave($insert) { if (parent::beforeSave($insert)) { // Place your custom code here if (!$this->notChangePassword) $this->setPassword($this->password); return true; } }
这是原因。 $notChangePassword
是null
的默认设置,因此将在每个$this->setPassword($this->password)
上调用save()
(并散列已散列的密码)。
我建议不要对原始密码和哈希密码使用相同的属性。您可以引入$rawPassword
属性,并以表格的形式代替$password
。
class User extends ActiveRecord implements IdentityInterface {
public $rawPassword;
public function beforeSave($insert) {
if (parent::beforeSave($insert)) {
if (!empty($this->rawPassword)) {
$this->setPassword($this->rawPassword);
}
return true;
}
}
// ...
}