Migration - uniqcle/Yii2 GitHub Wiki

Миграции являются частью Консольного приложения и находятся в console/migrations

Creating migrations

Создание таблицы подписчики

cd /var/www/yii2site.ru                        # Переходим в папку проекта
php yii migrate/create create_table_subscriber # Создаем миграцию, где create_table_subscriber - назв. миграции

В папке console/migration появился новый файл m190716_044922_create_table_subscribers.php

use yii\db\Migration;

class m190716_044922_create_table_subscribers extends Migration
{

    public function safeUp()
    {
        $sql =  "CREATE TABLE `yii2advanced`.`subscribers` (
                  `id` INT(11) UNSIGNED NOT NULL,
                  `email` VARCHAR(45) NOT NULL,
                  PRIMARY KEY (`id`),
                  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
                  UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE); "; 

        Yii::$app->db->createCommand($sql)->execute(); 

    }


    public function safeDown()
    {
        $sql = "DROP TABLE IF EXISTS `subscribers`;"; 

        Yii::$app->db->createCommand($sql)->execute(); 
    }
}

An alternative way to create migrations

Создание таблицы подписчики

php yii migrate/create create_subscribers_table  #где  create_<name_table>_table команда с названием таблицы

при этом создается файл m190716_073752_create_subscribers_table.php

use yii\db\Migration;

class m190716_073752_create_subscribers_table extends Migration
{
    public function safeUp()
    {
        $this->createTable('{{%subscribers}}', [
            'id' => $this->primaryKey(),
            'email' => $this->string(200)
        ]);
    }

    public function safeDown()
    {
        $this->dropTable('{{%subscribers}}');
    }
}

Application of migrations

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] – кол-во записей

List of all database access methods

execute()     # выполнение SQL инструкции

# Работа с таблицами
createTable()   # создание таблицы
renameTable()   # переименование таблицы
dropTable()     # удаление таблицы
truncateTable() # удаление всех строк в таблице

# Работа со строками
insert()      # вставка одной строки
batchInsert() # вставка нескольких строк
update()      # обновление строк
delete()      # удаление строк

# Работа со столбцами
addColumn()    # добавление столбца
renameColumn() # переименование столбца
dropColumn()   # удаление столбца
alterColumn()  # изменения столбца

# Работа с первичными ключами
addPrimaryKey()  # добавление первичного ключа
dropPrimaryKey() # удаление первичного ключа

# Работа с внешними ключами
addForeignKey()  # добавление внешнего ключа
dropForeignKey() # удаление внешнего ключа

# Работа с индексами
createIndex() # создание индекса
dropIndex()   # удаление индекса

Example:

use yii\db\Schema; 
use yii\db\Migration; 
class m151231_064302_create_organization_table extends Migration 
{ 
public function up() { 
            $tableOptions = null; 
            if ($this->db->driverName === 'mysql') {
            $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB';
        }
 
        $this->createTable('{{%organization}}', [
            'id' => $this->primaryKey(),
            'created_at' => $this->integer()->notNull(),
            'updated_at' => $this->integer()->notNull(),
            'name' => $this->string()->notNull(),
            'status' => $this->smallInteger()->notNull()->defaultValue(0),
        ], $tableOptions);
 
        $this->createIndex('idx_org_name', '{{%organization}}', 'name');
        $this->alterColumn ( '{{organization}}', 'updated_at', $this->integer() ); 
 
    }
 
    public function down()
    {
        echo "m151231_064302_create_organization_table cannot be reverted.\n";
        //$this->dropTable('{{%organization}}');
        return false;
    }
}

Example 2

Создание 3-х миграций. Добавление таблиц, заполнение данными, установка связей.

Миграция 1. Создание таблиц

use yii\db\Migration;

class m190819_083127_books_shop extends Migration
{

public function init()
{
   $this->db = 'db2';
   parent::init();
}

public function safeUp(){
        $this->createBooks(); 
        $this->createPublishers(); 
        $this->createAuthors();
        $this->createBooksToAuthors(); 

    }

    public function safeDown(){

        $this->dropTable('books');
        $this->dropTable('publishers'); 
        $this->dropTable('authors'); 
        $this->dropTable('books_to_authors'); 
    }



     //////////////////////////////////////////////////////////////////
    //BOOKS
    //////////////////////////////////////////////////////////////////
    public function createBooks(){

        //Создание таблицы
        $this->createTable('books', [
            'id' => $this->primaryKey(), 
            'title' => $this->string(256), 
            'publisher_id' => $this->integer(11)->notNull()
        ]);      
    }


     //////////////////////////////////////////////////////////////////
    //PUBLISHERS
    //////////////////////////////////////////////////////////////////
    public function createPublishers(){

        //Создание таблицы publishers
        $this->createTable('publishers', [
            'id' => $this->primaryKey(), 
            'name' => $this->string(11)
        ]);
    }


    //////////////////////////////////////////////////////////////////
    //AUTHORS
    //////////////////////////////////////////////////////////////////
    public function createAuthors(){

        $this->createTable('authors', [
            'id' => $this->primaryKey(), 
            'name' => $this->string(11)
        ]);
    }


     //////////////////////////////////////////////////////////////////
    //BOOKS_TO_AUTHORS
    //////////////////////////////////////////////////////////////////
    public function createBooksToAuthors(){

     $this->createTable('books_to_authors', [
        'books_id' => $this->integer(),
        'author_id' => $this->integer(),
        'created_at' => $this->dateTime(),
        'PRIMARY KEY(books_id, author_id)',
    ]);
   }

}

Миграция 2. Добавление ключей

use yii\db\Migration;

class m190819_100700_foreign extends Migration
{

    public function safeUp()
    {
        //Добавление ключа к связывающей таблице books
        $this->addForeignKey(
             'fk-books-publishers',  //Название ограничения внешнего ключа.
             'books',                //Таблица, к которой будет добавлено ограничение внешнего ключа.
             'publisher_id',         //Имя столбца, к которому будет добавлено ограничение. Если столбцов несколько, разделите их запятыми или используйте массив.
             'publishers',           //Таблица, на которую ссылается внешний ключ.
             'id',                   // Имя столбца, на который ссылается внешний ключ. Если столбцов несколько, разделите их запятыми или используйте массив.
             'CASCADE',              // delete
             'CASCADE'               //update
         );

          $this->addForeignKey(
            'fk-books',            
            'books_to_authors',    
            'books_id',            
            'books',               
            'id',                  
            'RESTRICT',             
            'RESTRICT'              
        );

          $this->addForeignKey(
             'fk-authors', 
             'books_to_authors', 
             'author_id',
             'authors', 
             'id',
             'RESTRICT',
             'RESTRICT'
          ); 
    }

    public function safeDown()
    {
        
        $this->dropForeignKey('fk-books', 'books_to_authors'); 
        $this->dropForeignKey('fk-authors', 'books_to_authors'); 
        $this->dropForeignKey('fk-books-publishers', 'books');
    }
}

Миграция 3. Добавление данных

use yii\db\Migration;

class m190820_040204_insert extends Migration
{
 
    public function safeUp()
    {
        //Добавление в publishers
        $this->insert('publishers', [
            'id' => 1,
            'name' => 'Эксмо'
        ]);

        $this->insert('publishers', [
            'id' => 2,
            'name' => 'Williams'
        ]);

         $this->insert('publishers', [
            'id' => 3,
            'name' => 'OReally'
        ]);

         $this->insert('publishers', [
            'id' => 4,
            'name' => 'Standard'
        ]);


        //Добавление в books
        $this->insert('books', [
            'id' => 1,
            'title' => 'Тестовая книга1', 
            'publisher_id' => 1
        ]);

        $this->insert('books', [
            'id' => 2,
            'title' => 'Тестовая книга2', 
            'publisher_id' => 3
        ]);

        $this->insert('books', [
            'id' => 3,
            'title' => 'Тестовая книга3', 
            'publisher_id' => 2
        ]);

        $this->insert('books', [
            'id' => 4,
            'title' => 'Тестовая книга4', 
            'publisher_id' => 3
        ]);

        $this->insert('books', [
            'id' => 5,
            'title' => 'Тестовая книга5', 
            'publisher_id' => 2
        ]);

        //Добавление в authors
        $this->insert('authors', [
            'id' => 1,
            'name' => 'Автор 1' 
        ]);

        $this->insert('authors', [
            'id' => 2,
            'name' => 'Автор 2' 
        ]);

        $this->insert('authors', [
            'id' => 3,
            'name' => 'Автор 3' 
        ]);

        $this->insert('authors', [
            'id' => 4,
            'name' => 'Автор 4' 
        ]);

        //Добавление в books_to_authors
        $this->insert('books_to_authors', [
            'books_id' => 1,
             'author_id' => 2,
            'created_at' => '2019-08-19 13:45' 
        ]);

        $this->insert('books_to_authors', [
            'books_id' => 2,
            'author_id' => 3,
            'created_at' => '2019-08-20 13:45'  
        ]);

        $this->insert('books_to_authors', [
            'books_id' => 3,
            'author_id' => 1,
            'created_at' => '2019-08-21 13:45' 
        ]);

        $this->insert('books_to_authors', [
            'books_id' => 4,
            'author_id' => 4,
            'created_at' => '2019-08-22 13:45' 
        ]);
    }

 
    public function safeDown()
    {
       
       $this->delete('books', ['in', 'id', [
           1, 2, 3, 4, 5, 6, 7, 8, 9, 10
       ]]);

       $this->delete('publishers', ['in', 'id', [
           1, 2, 3, 4, 5, 6, 7, 8, 9, 10
       ]]);

       $this->delete('books_to_authors', ['in', 'id', [
           1, 2, 3, 4, 5, 6, 7, 8, 9, 10
       ]]);

       $this->delete('authors', ['in', 'id', [
           1, 2, 3, 4, 5, 6, 7, 8, 9, 10
       ]]);
    }

}

Documentation

Дополнительные статьи и материалы

⚠️ **GitHub.com Fallback** ⚠️