Что такое миграции
Что такое миграция
Миграция — 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
Что происходит:
- Laravel смотрит таблицу
migrations. - Сравнивает с файлами в
database/migrations/. - Применяет только новые.
- Записывает в таблицу.
Файл миграции
Имя: 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
Если запись есть — миграция применена.
Что можно делать
В миграции:
- Создавать таблицы.
- Удалять таблицы.
- Добавлять колонки.
- Удалять колонки.
- Менять типы.
- Добавлять индексы.
- Создавать внешние ключи.
- Заполнять справочные данные.
Что НЕ надо
⚠️ Не редактируй уже применённые миграции.
Проблема:
- У тебя миграция применена.
- Ты её правишь.
- У коллеги — старая версия.
- У прода — что было.
Решение: новая миграция с изменением.
Правила
- Одна миграция — одно изменение.
- Не редактируй применённые.
- Пиши
down. - Тестируй локально.
- Бэкап перед прод-миграцией.
Практика
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— команды.- Батчи — группы миграций.
- Правило: не редактируй применённые.
Дальше — создание таблиц.