Миграции в Framework Yii 2

В Yii 2 есть механизм миграций. По сути миграции в БД это изменение структуры.

Создание миграций:

yii migrate/create <name>

name – параметр принимающий имя миграции

После выполнения команды будет создан класс:

class m141018_180924_18102014 extends Migration
{
    public function up()
    {

    }

    public function down()
    {
        echo "m141018_180924_18102014 cannot be reverted.\n";

        return false;
    }
}

В метод up() содержится код, который должен быть выполнен при накатывании миграции. В методе down() содержится код, который выполнится при откате миграции. Пример миграции:

class m141018_180924_18102014 extends Migration
{
    public function up()
    {
        $tableOptions = null;
        if ($this->db->driverName === 'mysql') {
            $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB';
        }

        $this->createTable('{{%category}}', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
        ], $tableOptions);

        $this->createTable('{{%post}}', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'anons' => Schema::TYPE_TEXT . ' NOT NULL',
            'content' => Schema::TYPE_TEXT . ' NOT NULL',
            'category_id' => Schema::TYPE_INTEGER,
            'author_id' => Schema::TYPE_INTEGER,
            'publish_status' => "enum('" . Post::STATUS_DRAFT . "','" . Post::STATUS_PUBLISH . "') NOT NULL DEFAULT '" . Post::STATUS_DRAFT . "'",
            'publish_date' => Schema::TYPE_TIMESTAMP . ' NOT NULL',
        ], $tableOptions);

        $this->createIndex('FK_post_author', '{{%post}}', 'author_id');
        $this->addForeignKey(
            'FK_post_author', '{{%post}}', 'author_id', '{{%user}}', 'id', 'SET NULL', 'CASCADE'
        );

        $this->createIndex('FK_post_category', '{{%post}}', 'category_id');
        $this->addForeignKey(
            'FK_post_category', '{{%post}}', 'category_id', '{{%category}}', 'id', 'SET NULL', 'CASCADE'
        );
    }

    public function down()
    {
        $this->dropTable('{{%post}}');
        $this->dropTable('{{%category}}');
    }
}

Данная миграция создаёт две таблицы и два внешних ключа.

Для создания таблицы используется метод createTable() принимающий два обязательных параметра, имя таблицы и масив описывающий свойства полей таблицы.

Для создания внешних ключей используются методы createIndex() для создания индекса, принимающий три параметра: имя индекса, имя таблицы и имя поля. И метод addForeignKey() принимающий семь параметров: имя внешнего ключа, имя таблицы и имя поля к которой добавляется ключ, имя таблицы и имя поля на которые ссылается ключ, стратегии при удалении и обновлении.

Для применения миграций используется команда:

yii migrate

Для применения нескольких миграций используется команда:

yii migrate/up 2

где 2 – число применяемых миграций

Для применения определённой версии миграции используется команда:

yii migrate/to 141018_180924

где 141018_180924 – timestamp миграций

Команда для отката миграции

yii migrate/down [step]
[step] – количество отменяемых миграций

Для повторного применения миграции применяется команда

yii migrate/redo [step]
[step] – количество повторно применяемых миграций

Просмотр примененных миграций:

yii migrate/history [limit]
[limit] – количество выводимых записей

Просмотр списка новых миграций, которые ещё не были применены:

yii migrate/new [limit]
[limit] – количество выводимых записей