Laravel. Migrations

screenshot-laravel com 2016-03-28 10-36-38 Я плавно подошёл к вопросу о базах данных. Но поскольку тема серьёзная решил рассмотреть её в нескольких постах. Сегодня я пишу о миграциях.

Миграции — это такой способ версионного контроля для вашей БД.

Можно ли жить без миграций? Можно. Но недолго (с)
————————————-

Например можно создавать/изменять таблицы, менять структуру вашей базы данных используя ваш любимый менеджер, например phpMyAdmin. Laravel этого не запрещает!

Если надо вам добавить поле в таблице, или целую таблицу:

  • Добавляете её вручную прямо в БД
  • Переписываете код

Это если у вас один сайт. Но если у вас CMS на несколько проектов? Тогда начинается цирк с переносом кода и изменения БД на другие инсталляции. И если изменения кода можно дёрнуть из Git, то изменения в БД надо всё так же вполнять вручную прямо в тот же день, пока не забылось.

И вдруг вылезает годовалой давности инсталляция вашей CMS, которую надо привести в актуальное состояние. И вот поди-ка вспомни, что вы там наизменяли в БД за целый год! А некоторые вещи возможно меняли не вы, а ваши товарищи по команде, и этих изменений возможно даже в глаза не видели. Как вспомнить то, чего не знал?

Совсем другое дело, если все изменения структуры БД откладывались в миграциях! И тогда у вас все ходы записаны.

Как создать миграцию
—————————————
Миграция — это PHP файл который содержит информацию, что нужно сделать чтобы накатить изменение, и что надо, чтобы откатить его. Файлы миграций хранятся в папке database/migrations.

Файл миграции можно создать и вручную, но как всегда есть утилита artisan для создания пустой заготовки.

$ php artisan make:migration create_table_blablabla --create=blablabla
Created Migration: 2017_01_06_215230_create_table_blablabla
  • make:migration — команда создания шаблона миграции
  • create_table_blablabla — это просто пример названия миграции
  • --create=blablabla — параметр, что должна делать эта миграция — создать таблицу blablabla

В результате у меня был создан файл 2017_01_06_215230_create_table_blablabla.php примерно такого содержания

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTableBlablabla extends Migration
{
    /* Миграция */
    public function up()
    {
        Schema::create('blablabla', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /* Откат миграции */
    public function down()
    {
        Schema::dropIfExists('blablabla');
    }
}

Класс миграции имеет два метода: up() для миграции и down() для её отката. Эти методы могут быть дополнены при необходимости.

Эта новая миграция создала у меня такую таблицу:

CREATE TABLE `blablabla` (
`id` int(10) UNSIGNED NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `blablabla` ADD PRIMARY KEY (`id`);

ALTER TABLE `blablabla` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

Чтобы добавить свои поля используется Schema Builder, мы его будем рассматривать чуть ниже. Пока ограничимся этим простейшим примером.

Что делать с миграцией
——————————

Запуск накопившихся миграций:

php artisan migrate

Чтобы помнить, какие миграции были выполнены, а какие нет, Артизан создаёт и ведёт таблицу migrations . Увидите такую таблицу в вашей БД — не удивляйтесь. Это оно.

Форсированный запуск миграций. Артизан не будет задавать вопросов и подтверждений на случай, если у вас там делается что-то непоправимое типа `DROP TABLE`.

php artisan migrate --force

Откатить последнюю миграцию

php artisan migrate:rollback

Откатить все миграции

php artisan migrate:reset

Откатить все миграции и повторить заново

php artisan migrate:refresh

Schema Builder
———————————-
Итак. Что можно делать в миграции. Попробуем переписать метод up(). Добавим поля

    public function up()
    {
        Schema::create('blablabla', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->text('description');
            $table->integer('order')->unsigned()->index();
            $table->timestamps();
        });
    }

Думаю тут всё понятно.

Если же надо не создать таблицу, а в существующей таблице добавить или изменить поле, то надо использовать не Schema::create, а Schema::table. И миграцию надо создавать с помощью опции `—table==`

$ php artisan make:migration modify_table_users --table=users
Created Migration: 2017_01_07_095249_modify_table_users

И после этого можно редактировать заготовку и добавлять свои действия.

Schema::table('users', function($table)
{
    // Добавляем новое поле
    $table->string('email');
    // Изменяем существующее поле
    $table->string('name', 50)->change();
    // Переименовываем поле
    $table->renameColumn('from', 'to');
    // Удалить поле
    $table->dropColumn('votes');
});

Думаю в целом всё понятно

Полный и подробный список, что можно делать в миграции смотрите в документации к Schema Builder

Резюме
———————
Как же мне не хватало миграций раньше!!!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>