Примеры работы с миграциями в Yii framework



Миграции — это очень полезный и удобный инструмент для управления структурой бд, значительно упрощающий командную разработку. В этом посте, я покажу примеры часто используемых миграций: create table, insert, update и add column.

В качестве примера будем использовать таблицу tbl_news:

CREATE TABLE IF NOT EXISTS `tbl_news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8,
  `created_at` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

Создание таблицы с помощью миграции

1. Управлениями миграциями в Yii производится с помощью консольной команды yiic migrate. Для того, чтобы создать нашу первую миграцию, выполним в консоли команду: yiic migrate create create_tbl_news. При вопросе «Create new migration »%path_to_migration%», отвечаем yes. Если все прошло правильно, то в директории protected/migrations должен появиться файл, с примерно таким названием m120302_172329_create_tbl_news.php. Первая часть названия файла это timestamp, вторая это название миграции, которое мы задали.

2. Редактируем созданный файл, в нем будет два метода up() и down(). Для создания таблицы нам нужен будет метод up(). Изменим его содержимое, дописав следующий код:

            $this->createTable('tbl_news', array(
                  'id' => 'pk',
                  'title' => 'VARCHAR(200) NOT NULL',
                  'content' => 'text',
            ));

Полностью файл миграции должен выглядеть так (не забываем, что timestamp у вас будет другой):

class m120302_172329_create_tbl_news extends CDbMigration
{
	public function up()
	{
		$this->createTable('tbl_news', array(
                  'id' => 'pk',
                  'title' => 'VARCHAR(200) NOT NULL',
                  'content' => 'text',
            ));
	}

	public function down()
	{
		echo "m120302_172329_create_tbl_news does not support migration down.\n";
		return false;
	}

	/*
	// Use safeUp/safeDown to do migration with transaction
	public function safeUp()
	{
	}

	public function safeDown()
	{
	}
	*/

3. Теперь, выполним в консоли команду yiic migrate, если все прошло удачно, то видим надпись Migrated up Scuccessfully! В бд должна появиться таблица tbl_news и tbl_migration. Двигаемся дальше.

Добавление записи в таблицу с помощью миграции

1. Выполняем команду: yiic migrate create insert_tbl_news.
2. Редактируем сгенерированный файл с миграцией. Добавляем в метод up() следующий код:

$this->insert('tbl_news', array(
                   'title' => 'Title 1',
                   'content' => 'Content 1',
));

3.Выполняем команду yiic migrate.

Изменение записи в таблице с помощью миграции

1. Выполняем команду: yiic migrate create update_tbl_news.
2. Редактируем сгенерированный файл с миграцией. Добавляем в метод up():

$this->update('tbl_news', array(
              'title' => 'Updated title'), 
              'id=1'
);

3.Выполняем команду yiic migrate.

Добавление колонки в таблицу с помощью миграции

1. Выполняем команду: yiic migrate create add_column_tbl_news.
Редактируем сгенерированный файл с миграцией. Добавляем в метод up():

$this->addColumn('tbl_news', 'created_at', 'date');

3. Выполняем команду yiic migrate.

Удаление колонки

1. Выполняем команду: yiic migrate create drop_column_tbl_news.
Редактируем сгенерированный файл с миграцией. Добавляем в метод up():

$this->dropColumn('tbl_news', 'created_at');

3. Выполняем команду yiic migrate.

Вот собственно и все. Подробнее об остальных миграциях можно почитать на официальном сайте.



Теги:

Комментарии

  1. Отличный материал, спасибо, добавил в закладки.

    Reply

  2. А можно еще документацию открыть)
    но все равно спасибо!

    Reply

  3. @Filsh. В документации только 1 пример.

    Reply

  4. а можно ли задавать в миграции кодировку?

    Reply

    Max Reply:


    Можно.

    public void createTable(string $table, array $columns, string $options=NULL)

    В $options задается кодировка. Например:

    $this->createTable(‘tbl_news’, array(
    ‘id’ => ‘pk’,
    ‘content’ => ‘varchar(255)’,
    ), «DEFAULT CHARSET=utf8»);

    Или так:

    $this->createTable(‘tbl_news’, array(
    ‘id’ => ‘pk’,
    ‘title’ => ‘varchar(255) CHARACTER SET utf8’,
    ‘content’ => ‘varchar(255) CHARACTER SET cp1251’,
    ));

    Reply

  5. Так как префиксы таблиц на могут быть разными, то вместо ‘tbl_news’ желательно везде использовать ‘{{news}}’ .

    Reply

    ElisDN Reply:


    *на разных сайтах

    Reply

  6. А можно ли в миграциях Yii создавать таблицы с проверкой IF NOT EXISTS (так как вы создали таблицу в начали статьи) ? Ну, с таблицами можно придумать что-то типа $this->execute(«CREATE TABLE IF NOT EXISTS……»);
    А как быть с полями таблицы? Т.е. если нужно перед добавлением поля проверить его наличие в таблице?

    Reply

    MobiAppSystems Reply:


    Ну так вы сами же написали использование $this->execute . Там можно любой код выполнять

    Reply

Оставить комментарий