Задать вопрос
slo_nik
@slo_nik

Как правильно создать sequence?

Необходимо создать уникальное значение для не id столбца.

В сущности столбец обозначен так

#[ORM\Column(type: 'integer', nullable: true)]
    private int $internalId;


Создаю миграцию

public function up(Schema $schema): void
    {
        $this->addSql('ALTER TABLE amqp_auth_user ADD internal_id INT NULL');
        $this->addSql('CREATE SEQUENCE amqp_auth_user_internal_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
        $this->addSql('ALTER TABLE amqp_auth_user ALTER internal_id SET DEFAULT nextval(\'amqp_auth_user_internal_id_seq\')');
        $this->addSql('ALTER SEQUENCE amqp_auth_user_internal_id_seq OWNED BY public.amqp_auth_user.internal_id;');
    }


Выполняю запрос на вставку в таблицу. Всё работает, "internal_id" заполняется последовательными значениями.

Но валицаю схема не проходит

[ERROR] The database schema is not in sync with the current mapping file.


Команда orm:schema-tool:update --dump-sql выдаёт запрос на удаление значения по умолчанию для столбца "internal_id"
ALTER TABLE amqp_auth_user ALTER internal_id DROP DEFAULT;


После выполнения данного запроса естественно ничего работать не будет, "interanal_id" будет заполняться "null".

Что не так я делаю? Как сделать так, чтобы проходила валидация схемы и не требовало DROP DEFAULT для internal_id?

p.s.

Пробовал и такой вариант

#[ORM\Column(insertable: false, updatable: false, columnDefinition: 'serial')]
 private int $internalId;


Результат тот же. Валидация не проходит, требует удаление значения по умолчанию.
  • Вопрос задан
  • 106 просмотров
Подписаться 1 Простой 13 комментариев
Пригласить эксперта
Ответы на вопрос 1
@tukreb
Теоретически можно попробовать так:
doctrine:
    dbal:
        types:
           sequence_type: { class: 'App\Types\SequenceType' }


final class SequenceType extends Type 
{
    #[\Override]
    public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?int
    {
        return $value === null ? null : (int)$value;
    }
    #[\Override]
    public function convertToDatabaseValue($value, AbstractPlatform $platform): null //или ?int
    {
        return null; //тут неуверен, может возвращать $value с ожиданием null
    }

    #[\Override]
    public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
    {
        return 'SERIAL';
    }

    public function getName(): string
    {
        return 'sequence_type';
    }
}


#[ORM\Column(name: 'internalId', type: 'sequence_type', nullable: true, insertable: false, updatable: false)]
private int $internalId;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы