пропустить уникальную проверку yii2 при обновлении, если новое значение равно предыдущему значению

Из-за того, что уникальный валидатор получает ошибку при обновлении («это имя пользователя уже занято»), я хочу проверить имя пользователя при обновлении, когда новое значение имени пользователя не равно предыдущему значению, это мое правило:

        [['username'], 'unique', 'on'=>'update', 'when' => function($model){
                return static::getOldUsername($model->id) !== $model->username;
            }
        ],

и моя функция - получить предыдущее значение имени пользователя:

public static function getOldUsername($id)
{
    return static::findIdentity($id)->username;
}

но это не работает, я думаю, что $model->getId() ничего не возвращает из-за статического идентификатора (например: 23) его работы.

        [['username'], 'unique', 'on'=>'update', 'when' => function($model){
                return static::getOldUsername(23) !== $model->username;
            }
        ],

как я могу получить идентификатор модели? или если у вас есть другие способы пропустить уникальную проверку yii2 при обновлении, если новое значение равно предыдущему значению, объясните это.

заранее спасибо


person SADi    schedule 08.11.2016    source источник


Ответы (3)


Я думаю, вы можете использовать $user->isAttributeChanged('username');

Пример (я не тестирую этот код):

[['username'], 'unique', 'on'=>'update', 'when' => function($model){
    return $model->isAttributeChanged('username')
}],
person user3265030    schedule 22.03.2017

я должен сказать, что мой код правильный, и теперь он работает хорошо, ошибка возникает из-за ,. Ой!!

Я надеюсь, что этот вопрос будет полезен для других зрителей, спасибо.

person SADi    schedule 08.11.2016
comment
очень полезный :-) - person msoa; 19.12.2016

person    schedule
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Alexander; 27.03.2018