Миграции перечислений PostgreSQL в Doctrine ORM
Бандл heymoon/doctrine-psql-enum, совместимый с Doctrine ORM версий 2 (composer require heymoon/doctrine-psql-enum ^1.0
для Symfony 6) и 3 (composer require heymoon/doctrine-psql-enum ^2.0
для Symfony 7), позволяет автоматически создавать новые типы перечислений PostgreSQL в миграциях на основе нативных enum в PHP.
Базовый пример перечисления на PHP:
use HeyMoon\DoctrinePostgresEnum\Attribute\EnumType;
#[EnumType('bundle_support_status')]
enum SupportStatus: string
{
case Maintained = 'maintained';
case Archived = 'archived';
}
Применяем его в нашем entity:
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Bundle
{
#[ORM\Column(type: 'enum', enumType: SupportStatus::class)]
private SupportStatus $status;
}
Теперь значения enum будут транслироваться в SQL-код для миграции:
CREATE TYPE bundle_support_status AS ENUM ('maintained','archived');
ALTER TABLE bundle ADD status bundle_support_status NOT NULL;
Отредактируем enum в PHP, добавив в него новый case:
case CriticalIssues = 'critical_issues';
Если предыдущая миграция уже была выполнена, следующая будет обновлять созданный ранее тип:
ALTER TYPE bundle_support_status ADD VALUE 'critical_issues'
Таким образом можно свободно использовать преимущества нативного enum PostgreSQL размером 4 байта, что может быть особенно важно для больших таблиц.