Миграции баз данных в PHP: Полное руководство по инструментам и библиотекам

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Миграции баз данных в PHP: современные инструменты и практики

Миграции баз данных — это неотъемлемая часть современной разработки на PHP. Они позволяют командам разработчиков синхронизировать изменения схемы базы данных, отслеживать историю изменений и автоматически применять их на разных окружениях (локальная среда, стейджинг, продакшн). В этой статье мы рассмотрим основные библиотеки и инструменты для миграций в PHP, их установку, настройку и примеры использования.

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

Миграция базы данных — это скрипт, который описывает изменение схемы: создание таблицы, добавление/удаление колонок, индексов, внешних ключей. Миграции позволяют:

  • Версионировать изменения структуры БД вместе с кодом приложения.
  • Автоматизировать развертывание на новых серверах.
  • Откатывать изменения при необходимости.
  • Работать в команде без конфликтов.

Популярные библиотеки для миграций в PHP

1. Phinx (robmorgan/phinx)

Phinx — одна из самых популярных независимых библиотек для миграций. Она не привязана к конкретному фреймворку и поддерживает MySQL, PostgreSQL, SQLite, SQL Server.

Установка через Composer:

composer require robmorgan/phinx

Создание файла конфигурации phinx.yml:

paths:
    migrations: '%%PHINX_CONFIG_DIR%%/db/migrations'
    seeds: '%%PHINX_CONFIG_DIR%%/db/seeds'

environments:
    default_migration_table: phinxlog
    default_database: development
    development:
        adapter: mysql
        host: localhost
        name: myapp_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

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

<?php

use Phinx\Migration\AbstractMigration;

class CreateUsersTable extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('users', ['id' => false, 'primary_key' => ['id']]);
        $table->addColumn('id', 'biginteger', ['identity' => true])
              ->addColumn('username', 'string', ['limit' => 50])
              ->addColumn('email', 'string', ['limit' => 100])
              ->addColumn('created_at', 'datetime')
              ->addColumn('updated_at', 'datetime', ['null' => true])
              ->addIndex(['email'], ['unique' => true])
              ->create();
    }
}

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

vendor/bin/phinx migrate -e development

2. Doctrine Migrations (doctrine/migrations)

Doctrine Migrations — часть экосистемы Doctrine ORM. Идеально подходит для проектов, уже использующих Doctrine. Поддерживает все популярные СУБД.

Установка:

composer require doctrine/migrations

Настройка (migrations.php):

<?php
return [
    'table_storage' => [
        'table_name' => 'doctrine_migration_versions',
    ],
    'migrations_paths' => [
        'App\Migrations' => './migrations',
    ],
    'all_or_nothing' => true,
    'transactional' => true,
    'check_database_platform' => true,
];

Пример миграции:

<?php

namespace App\Migrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

class Version20240101000000 extends AbstractMigration
{
    public function up(Schema $schema): void
    {
        $table = $schema->createTable('products');
        $table->addColumn('id', 'integer', ['autoincrement' => true]);
        $table->addColumn('name', 'string', ['length' => 255]);
        $table->addColumn('price', 'decimal', ['precision' => 10, 'scale' => 2]);
        $table->setPrimaryKey(['id']);
    }

    public function down(Schema $schema): void
    {
        $schema->dropTable('products');
    }
}

Команды для работы:

vendor/bin/doctrine-migrations migrate
vendor/bin/doctrine-migrations generate
vendor/bin/doctrine-migrations execute --down 'App\Migrations\Version20240101000000'

3. Laravel Migrations (встроенный инструмент)

Если вы используете Laravel, то встроенная система миграций — лучший выбор. Она тесно интегрирована с Eloquent ORM и Artisan CLI.

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

php artisan make:migration create_orders_table

Пример миграции:

<?php

use Illuminate\Database\Migrations\                    

Рекомендаций