# Миграции LARAVEL 12 ## Гайд по миграциям в **Laravel 12** > Laravel 12 вышел 6 февраля 2025 г. и привнёс несколько аккуратных улучшений к системе миграций ― от обработчика `shouldRun()` до опции `--isolated` для безопасного выката. Ниже — выжимка шаг-за-шагом, с примерами кода и советами из практики. --- ### 1. Концепция и подготовка окружения *Миграции — это контроль версий для вашей БД* ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans")). 1. **Требования**: PHP ≥ 8.3, Composer ≥ 2.8, любая из поддерживаемых СУБД (MySQL 8, MariaDB 10.6, PostgreSQL 13, SQLite 3, SQL Server 2019). 2. **Настройка `.env`**: заполняем `DB_CONNECTION`, `DB_HOST`, `DB_PORT`, `DB_DATABASE`, `DB_USERNAME`, `DB_PASSWORD`. 3. **Запуск проекта**: ```bash composer create-project laravel/laravel:^12 myapp cd myapp && php artisan serve ``` --- ### 2. Создаём миграции
ЗадачаКомандаЧто делает
**Новая таблица**`php artisan make:migration create_posts_table`Laravel сам подставит `Schema::create()` в файле ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
**Изменить таблицу**`php artisan make:migration add_status_to_posts_table --table=posts`Сгенерирует `Schema::table()`
**Указать путь**`--path=database/migrations/admin`Полезно при модулярной архитектуре
**Создать, но не запускать пока**добавить в файл метод `shouldRun()`Вернёт `false`, миграция пропустится ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
#### Минимальный пример ```php id(); $table->string('title')->index(); $table->text('body'); $table->boolean('published')->default(false); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('posts'); } }; ``` --- ### 3. Запуск миграций
КомандаДля чего нужнаГде пригодится
`php artisan migrate`Применить все «висящие» миграции ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))Локальная разработка
`php artisan migrate --pretend`Показать SQL без выполнения ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))Code-review, CI
`php artisan migrate --isolated`Заблокирует одновременный запуск на нескольких нодах ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))Blue-/green deploy
`php artisan migrate --force`Подавить подтверждение в prod ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))CI/CD pipeline
`php artisan migrate:status`Таблица применённых/неприменённых ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))Аудит
--- ### 4. Откат и перезапуск
КомандаЧто делает
`php artisan migrate:rollback`Откатить последний *batch* ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
`php artisan migrate:rollback --step=2`Откатить ровно 2 файла
`php artisan migrate:reset`Откатить **всё** ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
`php artisan migrate:refresh --seed`Полный откат → заново → сиды ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
`php artisan migrate:fresh`Drop all tables → заново ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
--- ### 5. Оптимизация: squash-дампы С ростом проекта сотни файлов замедляют CI. Используйте: ```bash php artisan schema:dump --prune # создаст dump.sql и удалит старые миграции ``` На чистой базе Laravel сначала прогонит `dump.sql`, а затем только новые миграции ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans")). --- ### 6. Лайфхаки и лучшие практики 1. **Атомарность**: тяжёлые изменения (переименование столбцов, удаление индексов) выполняйте в отдельных мелких миграциях. 2. **Idempotency**: проверяйте `Schema::hasTable()` / `hasColumn()` перед изменениями для совместимости между ветками ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans")). 3. **Транзакции**: `public bool $withinTransaction = true;` в классе миграции гарантирует откат при ошибке (по умолчанию true для поддерживаемых СУБД). 4. **Странициируйте деплой**: для «живых» таблиц используйте «параллельную» стратегию — добавьте новый столбец, заполните его бэкграунд-джобой, переключайтесь, потом удаляйте старый. 5. **CI-тесты**: в PHPUnit подключите трейт `RefreshDatabase` — он вызывает `migrate:fresh` и откатывает после тестов. 6. **Stub publishing**: ```bash php artisan stub:publish --only=migration resources/stubs/migration.stub ``` Настройте свои шаблоны под корпоративные стандарты. --- ### 7. Отладка типичных ошибок
СимптомПричинаРешение
`SQLSTATE[42S01]: Table already exists`Миграция не в `down()` или путаются именаПроверить `down()`, убедиться в правильном порядке launch-batch
`Class ... not found`Переименовали файл/классОчистить кэш `composer dump-autoload`
Ошибка кодировки/сортировкиMySQL 8, несовпадение `charset/collation`Явно задать `$table->charset('utf8mb4');` ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans"))
--- ### 8. Чек-лист перед продакшен-выкатом - [ ] [ ] Миграции проходят `php artisan migrate --pretend` на staging. - [ ] [ ] Включён `--isolated` или ручная блокировка. - [ ] [ ] Тесты используют ту же версию СУБД, что и prod. - [ ] [ ] Резервная копия БД лежит в безопасном месте. - [ ] [ ] Для разрушительных изменений используется «expand-migrate-contract» паттерн. --- ### 9. Ссылки для углубления - Официальная документация «Database → Migrations» Laravel 12 ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans")) - Ченджлог 12.x (`shouldRun`, `isolated`) GitHub ([laravel.com](https://laravel.com/docs/12.x/migrations "Database: Migrations - Laravel 12.x - The PHP Framework For Web Artisans")) - Release Notes 12.x для общего понимания цикла релизов ([laravel.com](https://laravel.com/docs/12.x/releases?utm_source=chatgpt.com "Release Notes - Laravel 12.x - The PHP Framework For Web Artisans")) --- #### Краткий итог Миграции в Laravel 12 — зрелый инструмент: **генерируем** `make:migration`, **описываем** `up()/down()`, **запускаем** `migrate`, **откатываем** `rollback`. Новинка `shouldRun()` помогает «прятать» эксперименты, а `--isolated` — уберечь прод от гонок. Пользуйтесь «мелкими, атомарными» паттернами, держите *schema dump* в репозитории и внедряйте миграции в CI — тогда база данных будет версионироваться так же уверенно, как и код.