Страница 1 из 1
Переименование поля username в бд
Добавлено: 2019.10.03, 22:23
Drugpunker
Всем привет.
Опять решил заняться изучением 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) прописано новое название поля.
Re: Переименование поля username в бд
Добавлено: 2019.10.03, 22:34
ElisDN
Во всех файлах поменяйте через поиск-замену.
Re: Переименование поля username в бд
Добавлено: 2019.10.04, 05:50
Drugpunker
ElisDN писал(а): ↑2019.10.03, 22:34
Во всех файлах поменяйте через поиск-замену.
Везде поменял.
Абсолютно везде, вручную.
Ну и, поиск и замена затрёт переменные класса $username.
То есть всё-таки не в валидаторе дело?
Переменные не должны же именоваться соответственно полям в бд...
Re: Переименование поля username в бд
Добавлено: 2019.10.04, 08:36
ElisDN
Валидатор ищет по умолчанию по имени поля, которое валидирует. Переопределить можно через targetAttribute.
Re: Переименование поля username в бд
Добавлено: 2019.10.07, 23:00
Drugpunker
Что осталось непонятным.
Поле ввода ника в форме именуется 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 по-умолчанию, таким образом "заставляет обнажать" имена колонок в бд?
Re: Переименование поля username в бд
Добавлено: 2019.10.08, 06:18
ElisDN
Ничего он не заставляет обнажать.
Это ошибка не от валидатора, а от отсутствия поля public $username в SignupForm.
Re: Переименование поля username в бд
Добавлено: 2019.10.08, 09:14
yiiliveext
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() заменить строку
на
Re: Переименование поля username в бд
Добавлено: 2019.10.09, 08:22
Drugpunker
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() заменить строку
на
Да, всё правильно описали.
Так и сделал, не отписался ещё просто.
Спасибо большое всем за помощь.
Разобрался в тонкостях валидатора. Гуд.
Продолжаю клепать проект.
Как правильно анализировать выдаваемые сервером ошибки?
Помимо var_dump и не знаю ничего.
Допустим сервер выдаёт ошибку о том, что какой-то метод в ядре фреймворка бросил эксепшн.
И абсолютно непонятно как этод метод был задействован.
И что привело к этой ошибке.
Может быть существует некая "Хорошая практика" или расширение, показывающее "этот метод вызвал тот, потом тот принял такие-то аргументы, и поэтому всё так произошло"
Может быть вопрос утопический, но мало ли.
Порой реально непонятно ничего.
Re: Переименование поля username в бд
Добавлено: 2019.10.09, 09:47
ElisDN
На
странице ошибки проматываем и прокликиваем Stack Trace ниже до строк своего кода.
А для полного контроля подключаем отладчик XDebug.
Re: Переименование поля username в бд
Добавлено: 2019.10.10, 09:20
Drugpunker
Ещё раз спасибо.
Побежал изучать.
Тему закрываю.