Переименование поля username в бд

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
Drugpunker
Сообщения: 87
Зарегистрирован: 2014.08.13, 19:44

Переименование поля username в бд

Сообщение Drugpunker » 2019.10.03, 22:23

Всем привет.
Опять решил заняться изучением Yii. :)

Не могу найти решения.
Изменил таблицу user в бд.
Ну как изменил, дополнил кучей нужных полей.
Поле username изменил на nickname.
Потому что помимо имени аккаунта пользователя должно быть ещё и реальное имя.

Модель оставил User.

При отправке данных из формы регистрации, ловлю ошибку:

Код: Выделить всё

Database Exception – yii\db\Exception
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.username' in 'where clause'
The SQL being executed was: SELECT EXISTS(SELECT * FROM `users` WHERE `users`.`username`='Admin')
Error Info: Array
(
    [0] => 42S22
    [1] => 1054
    [2] => Unknown column 'users.username' in 'where clause'
)
↵
Caused by: PDOException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.username' in 'where clause'
in \www\vendor\yiisoft\yii2\db\Command.php at line 1290
Вижу, что валидатор по-прежнему пытается найти пользователя по username.
Предполагаю, что где-то существует некий сеттер, который и именует поля авторизации автоматом.
Возможно в IdentityInterface.
Не нашёл.

Подскажите пжл, что я не учёл?
Модель User не менял. Только прописал свою таблицу.
В методе findByUsername($username) прописано новое название поля.

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Переименование поля username в бд

Сообщение ElisDN » 2019.10.03, 22:34

Во всех файлах поменяйте через поиск-замену.

Drugpunker
Сообщения: 87
Зарегистрирован: 2014.08.13, 19:44

Re: Переименование поля username в бд

Сообщение Drugpunker » 2019.10.04, 05:50

ElisDN писал(а):
2019.10.03, 22:34
Во всех файлах поменяйте через поиск-замену.
Везде поменял.
Абсолютно везде, вручную.
Ну и, поиск и замена затрёт переменные класса $username. ;)

То есть всё-таки не в валидаторе дело?
Переменные не должны же именоваться соответственно полям в бд...

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Переименование поля username в бд

Сообщение ElisDN » 2019.10.04, 08:36

Валидатор ищет по умолчанию по имени поля, которое валидирует. Переопределить можно через targetAttribute.

Drugpunker
Сообщения: 87
Зарегистрирован: 2014.08.13, 19:44

Re: Переименование поля username в бд

Сообщение Drugpunker » 2019.10.07, 23:00

Что осталось непонятным.
Поле ввода ника в форме именуется username. По-дефолту в yii2.
Я переименовал все переменные/rules и т.п. в nickname.

Теперь, при попытке перейти на страницу регистрации валится ошибка:

Код: Выделить всё

Exception (Unknown Property) 'yii\base\UnknownPropertyException' with message 'Getting unknown property: frontend\models\SignupForm::username'
Понятно, что поле ввода в форме должно (как хочет валидатор) называться поле в таблице бд.
Но так не хочу я.

Пытаюсь, в модели SignupForm, в методе rules добавить targetAttribute, чтобы имя поля осталось как указано в форме, а валидация в бд происходила в столбце nickname.

Делаю так, но ошибка непобедима.

Код: Выделить всё

['username', 'filter', 'filter' => 'trim'],
            ['username', 'required'],
            ['username', 'unique', 'targetAttribute' => 'nickname', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
            ['username', 'string', 'min' => 2, 'max' => 255],
И самое главное, мне непонятно, почему yii2 по-умолчанию, таким образом "заставляет обнажать" имена колонок в бд?

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Переименование поля username в бд

Сообщение ElisDN » 2019.10.08, 06:18

Ничего он не заставляет обнажать.

Это ошибка не от валидатора, а от отсутствия поля public $username в SignupForm.

yiiliveext
Сообщения: 478
Зарегистрирован: 2019.08.13, 01:49

Re: Переименование поля username в бд

Сообщение yiiliveext » 2019.10.08, 09:14

Drugpunker писал(а):
2019.10.07, 23:00
Что осталось непонятным.
Поле ввода ника в форме именуется username. По-дефолту в yii2.
Я переименовал все переменные/rules и т.п. в nickname.

Теперь, при попытке перейти на страницу регистрации валится ошибка:
Ван надо было переименовать только в модели User и шаблонах common/mail/emailVerify-html.php и /common/mail/emailVerify-text.php
В модели SignupForm надо только откорректировать правило

Код: Выделить всё

['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
на

Код: Выделить всё

['username', 'unique', 'targetClass' => '\common\models\User', 'targetAttribute' => 'nickname', 'message' => 'This username has already been taken.'],
и в методе signup() заменить строку

Код: Выделить всё

$user->username = $this->username;
на

Код: Выделить всё

$user->nickname = $this->username;

Drugpunker
Сообщения: 87
Зарегистрирован: 2014.08.13, 19:44

Re: Переименование поля username в бд

Сообщение Drugpunker » 2019.10.09, 08:22

yiiliveext писал(а):
2019.10.08, 09:14
Drugpunker писал(а):
2019.10.07, 23:00
Что осталось непонятным.
Поле ввода ника в форме именуется username. По-дефолту в yii2.
Я переименовал все переменные/rules и т.п. в nickname.

Теперь, при попытке перейти на страницу регистрации валится ошибка:
Ван надо было переименовать только в модели User и шаблонах common/mail/emailVerify-html.php и /common/mail/emailVerify-text.php
В модели SignupForm надо только откорректировать правило

Код: Выделить всё

['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
на

Код: Выделить всё

['username', 'unique', 'targetClass' => '\common\models\User', 'targetAttribute' => 'nickname', 'message' => 'This username has already been taken.'],
и в методе signup() заменить строку

Код: Выделить всё

$user->username = $this->username;
на

Код: Выделить всё

$user->nickname = $this->username;
Да, всё правильно описали.
Так и сделал, не отписался ещё просто.
Спасибо большое всем за помощь.
Разобрался в тонкостях валидатора. Гуд.
Продолжаю клепать проект.

Как правильно анализировать выдаваемые сервером ошибки?
Помимо var_dump и не знаю ничего.
Допустим сервер выдаёт ошибку о том, что какой-то метод в ядре фреймворка бросил эксепшн.
И абсолютно непонятно как этод метод был задействован.
И что привело к этой ошибке.

Может быть существует некая "Хорошая практика" или расширение, показывающее "этот метод вызвал тот, потом тот принял такие-то аргументы, и поэтому всё так произошло" :)

Может быть вопрос утопический, но мало ли.
Порой реально непонятно ничего.

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Переименование поля username в бд

Сообщение ElisDN » 2019.10.09, 09:47

На странице ошибки проматываем и прокликиваем Stack Trace ниже до строк своего кода.

А для полного контроля подключаем отладчик XDebug.

Drugpunker
Сообщения: 87
Зарегистрирован: 2014.08.13, 19:44

Re: Переименование поля username в бд

Сообщение Drugpunker » 2019.10.10, 09:20

Ещё раз спасибо.
Побежал изучать.
Тему закрываю.

Закрыто