Как работают миграции в Laravel?php-76

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

1. Основные принципы работы

  • Файлы миграций хранятся в database/migrations/
  • Каждая миграция — это отдельный класс с методами up() и down()
  • Система отслеживания выполненных миграций через таблицу migrations

2. Создание миграции

Генерация новой миграции:

php artisan make:migration create_users_table

Для модели с миграцией:

php artisan make:model User -m

3. Структура файла миграции

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

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

class CreateUsersTable extends Migration
{
    // Выполнение миграции
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id(); // BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
            $table->string('name'); // VARCHAR(255)
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken(); // VARCHAR(100) NULLABLE
            $table->timestamps(); // created_at и updated_at
        });
    }

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

4. Основные типы колонок

Метод Описание SQL-эквивалент
$table->id() Автоинкрементный первичный ключ BIGINT UNSIGNED PK AI
$table->string() Строковое поле VARCHAR
$table->text() Длинный текст TEXT
$table->integer() Целое число INT
$table->float() Число с плавающей точкой FLOAT
$table->boolean() Логическое значение TINYINT(1)
$table->date() Дата DATE
$table->json() JSON-данные JSON

5. Модификаторы колонок

$table->string('email')->unique()->nullable();
$table->decimal('amount', 8, 2)->default(0.00);
$table->unsignedBigInteger('user_id')->index();
$table->foreign('user_id')->references('id')->on('users');

6. Выполнение миграций

Основные команды:

# Выполнить все новые миграции
php artisan migrate

# Откатить последнюю миграцию
php artisan migrate:rollback

# Откатить все миграции
php artisan migrate:reset

# Перезапустить все миграции (rollback + migrate)
php artisan migrate:refresh

# Показать статус миграций
php artisan migrate:status

7. Продвинутые сценарии

Создание связей

$table->foreignId('user_id')
      ->constrained()
      ->onUpdate('cascade')
      ->onDelete('cascade');

Изменение существующей таблицы

Schema::table('users', function (Blueprint $table) {
    $table->string('phone')->after('email');
});

Генерация данных при миграции

public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->id();
        $table->string('name');
    });

    DB::table('roles')->insert([
        ['name' => 'Admin'],
        ['name' => 'User']
    ]);
}

8. Безопасность и best practices

  1. Не изменяйте выполненные миграции — создавайте новые
  2. Используйте откаты для всех изменений структуры
  3. Тестируйте миграции на staging перед production
  4. Резервируйте БД перед выполнением миграций
  5. Используйте одинаковые окружения для разработки и продакшена

Резюмируем:

  1. Миграции — это система контроля версий для БД
  2. Каждая миграция имеет up() (применить) и down() (откатить)
  3. Schema Builder предоставляет удобный API для работы с БД
  4. Артизан-команды управляют жизненным циклом миграций
  5. Правила хорошего тона:
    • Одна миграция = одно логическое изменение
    • Всегда предусматривайте возможность отката
    • Миграции должны быть идемпотентными

Для сложных проектов рекомендуется:

  • Разделять миграции структуры и данных
  • Использовать migrate:fresh только в разработке
  • Автоматизировать выполнение миграций в CI/CD