atom1c.ru

Laravel Database Migrations: Управление изменениями схемы базы данных

1. Введение в Laravel Migrations

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

// Пример базовой миграции
php artisan make:migration create_users_table

// Сгенерированный файл
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamps();
    });
}

2. Почему миграции важны

  • Контроль версий схемы базы данных
  • Совместная работа в команде
  • Автоматизация развертывания
  • Возможность отката изменений

3. Создание и выполнение миграций

// Создание миграции
php artisan make:migration add_phone_to_users_table

// Добавление нового поля
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('phone')->nullable();
    });
}

// Откат изменений
public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('phone');
    });
}

// Выполнение миграций
php artisan migrate

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

4. Лучшие практики управления изменениями схемы

a. Соглашения об именовании

// Правильно
create_users_table
add_phone_to_users_table
create_user_profiles_table

// Неправильно
users
new_field
update_db

b. Избегание потери данных при обновлениях

// Безопасное изменение колонки
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('name', 100)->change();
    });
}

// Добавление временной колонки
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('name_new')->nullable();
        // Здесь можно добавить код для переноса данных
    });
}

c. Контроль версий и откаты

// Проверка существования таблицы
if (!Schema::hasTable('users')) {
    Schema::create('users', function (Blueprint $table) {
        // ...
    });
}

// Проверка существования колонки
if (!Schema::hasColumn('users', 'phone')) {
    Schema::table('users', function (Blueprint $table) {
        $table->string('phone')->nullable();
    });
}

d. Тестирование перед развертыванием

// Создание тестовой базы данных
php artisan migrate --env=testing

// Откат всех миграций и их повторное выполнение
php artisan migrate:fresh

5. Использование сидеров вместе с миграциями

// Создание сидера
php artisan make:seeder UsersTableSeeder

// Пример сидера
class UsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'password' => Hash::make('password')
        ]);
    }
}

// Запуск сидеров
php artisan db:seed

6. Распространенные ошибки и как их избежать

// Ошибка: Отсутствие down() метода
public function down()
{
    // Всегда определяйте метод down()
    Schema::dropIfExists('users');
}

// Ошибка: Неправильный порядок зависимостей
// Сначала создаем родительскую таблицу
Schema::create('users', function (Blueprint $table) {
    $table->id();
});

// Затем создаем зависимую таблицу
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained();
});

7. Заключение

Миграции Laravel - мощный инструмент для управления схемой базы данных. Следуя этим практикам, вы можете:

  • Поддерживать чистоту и организованность кода
  • Избегать конфликтов при командной разработке
  • Обеспечивать безопасное обновление базы данных
  • Упростить процесс развертывания
// Полезные команды для работы с миграциями
php artisan migrate:status // Проверка статуса миграций
php artisan migrate:reset // Откат всех миграций
php artisan migrate:refresh // Откат и повторное выполнение всех миграций
php artisan migrate:fresh --seed // Пересоздание базы данных с сидами