Доктрина Symfony Невозможно изменить идентификатор столбца - PullRequest
0 голосов
/ 03 мая 2018

Я работаю над приложением AngularJS с Symfony 2.7, и у меня есть форма регистрации, которая не работает, я не могу зарегистрировать нового пользователя в базе данных. Первая ошибка произошла

[Doctrine\DBAL\DBALException]

Запрошено перечисление неизвестного типа базы данных, Doctrine \ DBAL \ Platforms \ MySqlPlatform может не поддерживать это.

Итак, я отредактировал свой конфигурационный файл, добавив:

mapping_types:
        enum: string

и я выполнил:

php app/console doctrine:schema:update --force

Я получил это сообщение об ошибке:

    [Doctrine\DBAL\Exception\DriverException]

Возникла исключительная ситуация при выполнении 'ALTER TABLE user CHANGE id id INT AU TO_INCREMENT NOT NULL ...

1 Ответ

0 голосов
/ 03 мая 2018

Два решения для решения ваших проблем из документации: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / cookbook / mysql-enums.html .

Первый и более легкий:

Вы можете сопоставить ENUM с varchars. Вы можете зарегистрировать MySQL ENUM для сопоставления с Doctrine varchars. Таким образом, Doctrine всегда разрешает ENUM в Doctrine varchars. Он даже правильно обнаружит это совпадение при использовании команд обновления SchemaTool.

<?php
$conn = $em->getConnection();
$conn->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

В этом случае вы должны убедиться, что каждое поле varchar, являющееся перечислением в базе данных, получает только допустимые значения. Вы можете легко применить это в своих сущностях:

<?php
/** @Entity */
class Article
{
    const STATUS_VISIBLE = 'visible';
    const STATUS_INVISIBLE = 'invisible';

    /** @Column(type="string") */
    private $status;

    public function setStatus($status)
    {
        if (!in_array($status, array(self::STATUS_VISIBLE, self::STATUS_INVISIBLE))) {
            throw new \InvalidArgumentException("Invalid status");
        }
        $this->status = $status;
    }
}

Если вы хотите активно создавать перечисления с помощью инструмента-схемы Doctrine с помощью атрибута columnDefinition.

<?php
/** @Entity */
class Article
{
    /** @Column(type="string", columnDefinition="ENUM('visible', 'invisible')") */
    private $status;
}
...