Миграции перечислений 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 байта, что может быть особенно важно для больших таблиц.