Symfony doctrine无法更改列'id'

时间:2018-05-03 09:59:33

标签: symfony doctrine-orm

我正在使用Symfony 2.7处理AngularJS App,我有一个无效的注册表单,我无法在数据库中注册新用户。 发生了第一个错误

[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非空......

1 个答案:

答案 0 :(得分:0)

解决文档问题的两种解决方案: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;
    }
}

如果要使用columnDefinition属性通过Doctrine Schema-Tool主动创建枚举。

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