Laravel миграции: от создания таблицы до мастерства

Laravel миграции: от создания таблицы до мастерства

Миграции в Laravel — это не просто способ создать таблицу в базе данных. Это философия разработки, система контроля версий для вашей структуры данных и мощный инструмент, который превращает хаотичное управление базой данных в элегантный, предсказуемый процесс. В этой статье мы погрузимся в мир миграций Laravel, начиная с основ создания таблиц и заканчивая продвинутыми практиками, которые сделают вашу работу с базой данных чистой и профессиональной.

Что такое миграции и зачем они нужны?

Представьте, что вы работаете в команде над проектом. Один разработчик добавляет новое поле в таблицу пользователей локально, другой меняет тип данных. Без системы контроля эти изменения быстро превращаются в хаос. Миграции решают эту проблему, описывая изменения структуры базы данных в коде на PHP. Каждая миграция — это отдельный файл с timestamp в названии, который можно применить (мигрировать) или откатить (откатить миграцию) на любом окружении: локальном, staging или production.

Миграции позволяют вашей базе данных "эволюционировать" вместе с кодом приложения. Они являются обязательной частью современной разработки на Laravel и других фреймворках.

Создание первой миграции для таблицы

В Laravel создание миграции — дело одной команды в Artisan CLI. Допустим, мы хотим создать таблицу для блога — `posts`.

Генерация файла миграции

Откройте терминал и выполните:

php artisan make:migration create_posts_table

Laravel создаст файл в папке `database/migrations` с именем вида `2023_10_05_123456_create_posts_table.php`. Откройте этот файл. Внутри вы увидите класс с двумя методами: `up()` и `down()`.

Структура метода up()

Метод `up()` описывает изменения, которые нужно применить к базе данных. Для создания таблицы мы используем фасад `Schema`:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id(); // Автоинкрементный первичный ключ
        $table->string('title'); // Строка VARCHAR
        $table->text('content'); // Текст TEXT
        $table->foreignId('user_id')->constrained()->onDelete('cascade'); // Внешний ключ
        $table->timestamps(); // created_at и updated_at
    });
}

Метод down() — ваша страховка

Метод `down()` описывает, как откатить изменения. Для создания таблицы откат — это её удаление:

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

Всегда проверяйте, что метод `down()` корректно отменяет действия метода `up()`. Это ваша гарантия на случай, если что-то пойдёт не так.

Типы столбцов и модификаторы

Blueprint предоставляет десятки методов для определения столбцов. Вот основные:

  • Числовые: `integer('views')`, `bigInteger('likes')`, `decimal('price', 8, 2)`
  • Строковые: `string('email')`, `text('bio')`, `longText('article')`
  • Дата и время: `date('published_at')`, `dateTime('expires_at')`
  • Специальные: `boolean('is_active')`, `json('meta')`, `uuid('identifier')`

К столбцам можно применять модификаторы:

$table->string('slug')->unique(); // Уникальный индекс
$table->text('excerpt')->nullable(); // Может быть NULL
$table->integer('order')->default(0); // Значение по умолчанию
$table->string('title')->index(); // Обычный индекс для ускорения поиска

Запуск и откат миграций

После написания миграции её нужно применить:

php artisan migrate

Эта команда выполнит все ещё не применённые миграции. Чтобы откатить последнюю операцию:

php artisan migrate:rollback

Для полного сброса всех миграций (осторожно!):

php artisan migrate:reset

Продвинутые техники

Связи между таблицами

Laravel упрощает создание внешних ключей:

$table->foreignId('category_id') // Создаст столбец category_id
      ->constrained() // Ссылается на id таблицы categories
      ->onDelete('cascade'); // Удалит пост при удалении категории

Миграции для изменения существующих таблиц

Чтобы добавить столбец в существующую таблицу, создайте миграцию:

php artisan make:migration add_is_featured_to_posts_table

И в методе `up()` используйте `Schema::table`:

public function up()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->boolean('is_featured')->default(false)->after('title');
    });
}

Лучшие практики

  1. Одна миграция — одна логическая задача. Не смешивайте создание таблицы и добавление индексов в разные миграции.
  2. Используйте осмысленные имена. `create_posts_table` понятнее, чем `new_table_01`.
  3. Всегда пишите метод `down()`. Это ваша страховка.
  4. Тестируйте миграции на staging-окружении перед запуском на production.
  5. Не редактируйте выполненные миграции. Создайте новую миграцию для изменений.

FAQ: Часто задаваемые вопросы

Как переименовать таблицу через миграцию?

Используйте метод `rename`: `Schema::rename('old_posts', 'new_posts');`

Можно ли откатить одну конкретную миграцию?

Да, с помощью `php artisan migrate:rollback --step=1`, где 1 — количество последних миграций для отката.

Как посмотреть статус всех миграций?

Команда `php artisan migrate:status` покажет, какие миграции уже применены, а какие нет.

Что делать, если миграция не выполняется из-за ошибки?

Исправьте ошибку в коде миграции, затем выполните `php artisan migrate:fresh`, чтобы пересоздать всю базу с нуля (осторожно с production!).

Нужно ли коммитить файлы миграций в Git?

Обязательно! Файлы миграций — это часть кодовой базы проекта, они должны быть в репозитории у всех разработчиков.