Yii2 миграции. Изменяем и удаляем колонку в таблице (ALTER COLUMN и DROP COLUMN)

  • 05.10.2018
  • PHP

Итак, добавляем новую миграцию с нашими изменениями. Назовем её change_user_table. Выполним в консоле команду:

Path_to_domain >yii migrate/create change_user_table

В результате мы получим файл, по адресу: domain\console\migrations\m181005_075120_change_user_table.php (Цифры будут отличаться).

Теперь добавим в метод up или safeUp две команды:

$this->alterColumn('user', 'email', $this->string(255)->null());
$this->addColumn('user', 'ava', $this->string(255)->after('email'));

Первая разрешит в поле email значение NULL, чтобы можно было не указывать адрес email при регистрации. Вторая, добавит колонку ava, для ссылки на аватарку зарегистрированного пользователя.

Конечно, можно было создать отдельную таблицу с профилем пользователя, но здесь мы учимся изменять существующие и добавлять новые колонки таблиц баз данных, при помощи инструмента миграций Yii2.

Теперь, сделаем возможность отката внесенных изменений. Для этого, в метод down добавим действия, обратные описанным выше.

$this->alterColumn('user', 'email', $this->string()->notNull());
$this->dropColumn('user', 'ava');

Соответственно, первая команда ALTER COLUMN, вернет запрет NOT NULL, на колонку email, а DROP COLUMN, удалит колонку ava

При этом, стоит учесть, что при наличии записей в таблице user, первый метод вернет ошибку MySql (при использовании этого движка):

SQLSTATE<span class="key">22004</span>: Null value not allowed: 1138 Invalid use of NULL value The SQL being executed was: ALTER TABLE `user` CHANGE `email` `email` varchar(255) NOT NULL'

Для выполнения этого запроса, следует удалить все данные в таблицы user. Второй метод удалит колонку со всеми данными.

Для отката изменений, выполним в консоле команду.

Path_to_domain >yii migrate/down

В данной статье били рассмотрены две команды консольной программы Yii2 migrate, это down и up, мы выполнили изменения существующей колонки методом alterColumn() и создали новую колонку методом addColumn(), так же мы предусмотрели возможность отката внесенных изменений в методе user, созданного класса миграций.

Спасибо, за внимание!

Комментарии