Если вы никогда не работали с миграциями в Yii, советую для начала прочесть прошлую статью. В данной статье я буду говорить только об отличиях миграций в Yii2 от миграций в Yii1.x
Запус команды не в protected, а в корне проекта. Запуск не через yiic, а через yii:
php yii migrate/create add_table_pages
Файлы миграций расположены в папке console/migrations
Применение миграций
php yiic migrate
В общий абстрактный класс Schema добавлены константы для типов данных.
public function up() { $this->createTable('news', [ 'id' => 'pk', 'title' => Schema::TYPE_STRING . ' NOT NULL', 'text' => Schema::TYPE_TEXT . ' NOT NULL', 'date_create' => Schema::TYPE_DATETIME, 'thumb' => Schema::TYPE_STRING ]); }
Подробная документация по миграциям на английском тут.
Вы забыли упомянуть транзакции
Про транзакции нужно вообще отдельную статью писать. К сожалению safeUp() и safeDown() это еще не все о транзакциях. И поддерживаются они в разных СУБД по разному. Поэтому зачем забивать ими голову начинающим разработчикам. Тем, кому транзакции нужны, хватит любопытства поискать инфу об этих методах, тем более что они есть в шаблоне миграции. А знания на тему, какая СУБД и в каком виде транзакции поддерживает у них, скорее всего уже есть.
Как после создания таблицы добавить в нее какие-нибудь начальные данные в рамках одной миграции? В таблицу users, админа например
$this->createTable(…)
$this->insert(…)
Более того, если вам нужны роли, то можно прям в миграции после добавления админа ему роль админа и назначить.
$admin = Yii::$app->authManager->createRole(‘admin’);
Yii::$app->authManager->add($admin);
Yii::$app->authManager->assign($admin, 1);
Задавать параметры полей в таком формате совсем не допустимо. Это ломает поддержку альтернативных баз данных.
Не согласна. Поддержку альтернативных БД это не ломает, если использовать yii\db\Schema
Как запускать одну миграцию внутри другой?
Например yii/rbac/migrations/
Лучший способ это отнаследовать свой класс миграции от класса другой миграций:
К сожалению на данный момент этот способ не работает для миграций самого фреимворка, т.к отсутствует namespace. Пойду создам тикет, т.к другого нормального способа выстраивать порядок применения миграций из фреимворка нет.