Migration - uniqcle/Yii2 GitHub Wiki
Миграции являются частью Консольного приложения и находятся в console/migrations
- Creating migrations
- An alternative way to create migrations
- Application of migrations
- List of all database access methods
- Example
- Example 2
Создание таблицы подписчики
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();
}
}
Создание таблицы подписчики
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}}');
}
}
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] – кол-во записей
execute() # выполнение SQL инструкции
# Работа с таблицами
createTable() # создание таблицы
renameTable() # переименование таблицы
dropTable() # удаление таблицы
truncateTable() # удаление всех строк в таблице
# Работа со строками
insert() # вставка одной строки
batchInsert() # вставка нескольких строк
update() # обновление строк
delete() # удаление строк
# Работа со столбцами
addColumn() # добавление столбца
renameColumn() # переименование столбца
dropColumn() # удаление столбца
alterColumn() # изменения столбца
# Работа с первичными ключами
addPrimaryKey() # добавление первичного ключа
dropPrimaryKey() # удаление первичного ключа
# Работа с внешними ключами
addForeignKey() # добавление внешнего ключа
dropForeignKey() # удаление внешнего ключа
# Работа с индексами
createIndex() # создание индекса
dropIndex() # удаление индекса
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;
}
}
Создание 3-х миграций. Добавление таблиц, заполнение данными, установка связей.
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)',
]);
}
}
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');
}
}
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
]]);
}
}