cr1gger
@cr1gger
Все дороги ведут в Рим — встретимся в Риме!

Почему не работает метод save()?

У меня есть такой метод:
public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {

            $this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password);

            return true;
        }
        return false;
    }
public function afterSave($insert, $changedAttributes)
    {
        # Добавляем пользователю группу пользователя
        $auth = Yii::$app->authManager;
        $user_group = $auth->getRole('user');
        $auth->assign($user_group, $this->id);
        parent::afterSave($insert, $changedAttributes);
    }

Перед сохранением генерируем пароль для пользователя.

Сейчас возникла такая проблема, что при попытки обновить данные пользователя, к примеру имя.
$model = Users::findOne(['id'=>1]);
$model->name = 'New name';
$model->save();


$model->save() - возвращает false.
$model->validate() - возвращает false;
$model->getErrors() - возвращает пустой массив.

Вот сам процесс изменения поля, изменяю баланс:
//$user = Users::findOne(['id'=>Yii::$app->user->identity->id]);
$user = Users::find()->where(['id' => Yii::$app->user->identity->id])->one();
        $user->balance = ($user->balance - $cost);
        
        if (!$order->save() || !$user->update()) {
            $response = ['code' => -99, 'text' => 'Произошла неизвестная ошибка, обратитесь в тех поддержку, код ошибки: -99'];
            $this->printAPI($response);
        } else {
            $response = ["code" => 5, "text" => "Заказ №" . $order->id . " успешно создан! ", 'balance' => $user->balance];
            $this->printAPI($response);
        }

В чем может быть проблема? Почему не сохраняет, я грешу на методы after и berfore save.
  • Вопрос задан
  • 352 просмотра
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
У вас не проходит валидация. Смотрите правила валидации. Выполните в коде var_dump($model->errors) перед формой. И смотрите ошибки. Если у вас нет ошибок одной модели - смотрите другую. Проверить валидация ли это или нет можно легко. $model->save(false)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Demisang
@Demisang
Backend PHP-developer
1. Нельзя писать
$this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password);


В методе after/beforeSave(), потому что первый раз предположим $password будет нормальным, а потом вытащив юзера из базы его password уже будет хешем, и сохранив юзера повторно - уже сгенерируется новый хеш пароля из старого хеша пароля, и так далее, короче после второго сохранения пароль пользователя будет совершенно непригодным.

2. Нельзя использовать $user->update() в конструкции if, потому что $user->update() возвращает не true/false, а количество изменённых строк в БД, но в Yii если модель не изменилась - ничего и не будет обновлено в базе(зачем лишний запрос), просто пишите $user->save()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы