Урок 01

Что такое миграции

Что такое миграция

Миграция — PHP-класс, описывающий изменение структуры БД. Каждое изменение — отдельный файл.

Идея: схема БД версионируется в git, как и код.

Зачем

Без миграций:

  • SQL-клиент вручную — кто и когда изменил, неизвестно.
  • Разные версии схемы на dev и prod.
  • Откатить невозможно.
  • Командная работа превращается в хаос.

С миграциями:

  • История схемы.
  • Синхронизация между средами.
  • Откат одной командой.
  • Все в команде видят изменения.
  • Работает на MySQL, PostgreSQL, SQLite.

Как работает

1. Создаёшь файл:

database/migrations/2026_10_15_120000_create_posts_table.php

2. Пишешь класс:

return new class extends Migration
{
    public function up(): void { /* применить */ }
    public function down(): void { /* откатить */ }
};

3. Запускаешь:

php artisan migrate

Что происходит:

  1. Laravel смотрит таблицу migrations.
  2. Сравнивает с файлами в database/migrations/.
  3. Применяет только новые.
  4. Записывает в таблицу.

Файл миграции

Имя: YYYY_MM_DD_HHMMSS_name.php.

Пример: 2026_10_15_120000_create_posts_table.php.

Дата — определяет порядок. Более ранние применяются первыми.

Структура

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

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Анонимный класс return new class extends Migration — с Laravel 8+.

Раньше — именованные классы. Сейчас — анонимные, потому что имя файла уже уникальное.

up и down

up() — что сделать (создать таблицу, добавить колонку).

down() — как откатить (удалить таблицу, колонку).

⚠️ down обязателен — даже если не собираешься откатывать.

Что если без down:

SQLSTATE: cannot rollback — no down method

Или пустой down — то же самое.

Создание

Простая миграция:

php artisan make:migration create_posts_table

С указанием таблицы:

php artisan make:migration add_status_to_posts_table --table=posts

Флаг --table=posts создаёт заготовку с Schema::table.

С созданием таблицы:

php artisan make:migration create_posts_table --create=posts

Флаг --create=posts создаёт заготовку с Schema::create.

Команды

php artisan migrate               # применить новые
php artisan migrate:status        # статус
php artisan migrate:rollback      # откатить последний батч
php artisan migrate:reset         # откатить всё
php artisan migrate:refresh       # откатить и применить
php artisan migrate:fresh         # снести и применить заново
php artisan migrate --pretend     # показать SQL

Батчи

Батч — группа миграций, применённых вместе.

Пример:

  • Первый migrate → batch 1 (10 миграций).
  • Второй migrate → batch 2 (3 новые).

rollback откатывает последний батч.

Не отдельную миграцию, а весь батч.

Таблица migrations

Laravel ведёт таблицу migrations:

migration                                       batch
2026_01_01_000000_create_users_table            1
2026_01_02_000000_create_posts_table            1
2026_10_15_120000_add_status_to_posts_table     2

Если запись есть — миграция применена.

Что можно делать

В миграции:

  • Создавать таблицы.
  • Удалять таблицы.
  • Добавлять колонки.
  • Удалять колонки.
  • Менять типы.
  • Добавлять индексы.
  • Создавать внешние ключи.
  • Заполнять справочные данные.

Что НЕ надо

⚠️ Не редактируй уже применённые миграции.

Проблема:

  • У тебя миграция применена.
  • Ты её правишь.
  • У коллеги — старая версия.
  • У прода — что было.

Решение: новая миграция с изменением.

Правила

  1. Одна миграция — одно изменение.
  2. Не редактируй применённые.
  3. Пиши down.
  4. Тестируй локально.
  5. Бэкап перед прод-миграцией.

Практика

1. Создай миграцию:

php artisan make:migration create_posts_table --create=posts

2. Заполни:

public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->cascadeOnDelete();
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}

public function down(): void
{
    Schema::dropIfExists('posts');
}

3. Применить:

php artisan migrate

4. Проверить:

php artisan db:show
php artisan migrate:status

5. Откатить:

php artisan migrate:rollback

Частые ошибки

1. Забыли use Illuminate\Support\Facades\Schema:

Schema::create(...);   // Class not found

2. Забыли use Blueprint:

function (Blueprint $table)   // Class not found

3. Редактирование применённой миграции:

Изменения не применятся, если migrate уже был

Решение: новая миграция.

4. Пустой down:

public function down(): void { }
// migrate:rollback не откатит

5. Запуск на проде без --force:

Application In Production. Do you really wish to run this command?

Решение: php artisan migrate --force.

Итог

  • Миграция — версия схемы БД.
  • up — применить, down — откатить.
  • Анонимный класс return new class.
  • Файл с датой — порядок.
  • migrate, rollback, fresh — команды.
  • Батчи — группы миграций.
  • Правило: не редактируй применённые.

Дальше — создание таблиц.