Руководство

Миграции базы данных

Храните изменения схемы базы данных в понятном порядке и фиксируйте их с помощью встроенной системы миграций.

Создайте миграцию в приложении

Миграции относятся к приложению и обычно размещаются в App\Database\Migrations. У каждого класса есть стабильный идентификатор в формате YYYYMMDDHHMMSS_description, а изменения схемы выполняются в up(Schema $schema). После применения миграции не меняйте её идентификатор.

example.php
<?php

declare(strict_types=1);

namespace App\Database\Migrations;

use Lemonade\Framework\Database\Migration\MigrationInterface;
use Lemonade\Framework\Database\Schema\Schema;

final class CreateUsersTable implements MigrationInterface
{
    public static function identifier(): string
    {
        return '20260908090000_create_users';
    }

    public function up(Schema $schema): void
    {
        $schema->create('users', static function ($table): void {
            $table->id();
            $table->string('email', 255);
            $table->string('password', 255);
        });
    }
}

Регистрируйте классы миграций явно

Регистрируйте каждую миграцию как class-string в AppServiceProvider. MigrationRegistry проверяет и сортирует идентификатор без создания экземпляра миграции. Поэтому уже применённые миграции и проверка статуса не требуют создания их экземпляров или разрешения зависимостей конструктора.

example.php
<?php

declare(strict_types=1);

namespace App\Providers;

use App\Database\Migrations\CreateUsersTable;
use Lemonade\Framework\Container\ContainerInterface;
use Lemonade\Framework\Core\ServiceProviderInterface;
use Lemonade\Framework\Database\Migration\MigrationRegistry;

final class AppServiceProvider implements ServiceProviderInterface
{
    public function register(ContainerInterface $container): void
    {
        $registry = $container->get(MigrationRegistry::class);

        $registry->register(CreateUsersTable::class);
    }
}

Запустите миграции и проверьте статус

Запускайте ожидающие миграции через CLI. database:migrate:status показывает применённые и ожидающие миграции, а также идентификаторы, которые есть в истории, но больше не зарегистрированы в приложении.

example.php
vendor/bin/lemonade database:migrate
vendor/bin/lemonade database:migrate:status

Не изменяйте историю применённых миграций

Миграции однонаправленные. Lemonade не предоставляет rollback, down(), batches, checksums, автоматический поиск миграций в файловой системе или автоматические DDL-транзакции. Доступные операции со схемой зависят от настроенного драйвера и диалекта базы данных.