Symfony2 Doctrine自定义类型生成不必要的迁移

9
我已经按照http://doctrine-orm.readthedocs.org/en/latest/cookbook/working-with-datetime.html的说明,创建了一个自定义的Doctrine类型。
以下是代码:
<?php

namespace XXX\Bundle\XXXBundle\Doctrine\Type;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;
use Doctrine\DBAL\Types\DateTimeType;

class UTCDateTimeType extends DateTimeType
{
    static private $utc = null;

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if ($value === null) {
            return null;
        }

        $value->setTimezone(new \DateTimeZone('UTC'));
        $dbDate = $value->format($platform->getDateTimeFormatString());

        return $dbDate;
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        if ($value === null) {
            return null;
        }

        $val = \DateTime::createFromFormat(
            $platform->getDateTimeFormatString(),
            $value,
            (self::$utc) ? self::$utc : (self::$utc = new \DateTimeZone('UTC'))
        );
        if (!$val) {
            throw ConversionException::conversionFailed($value, $this->getName());
        }
        return $val;
    }
}

问题在于我运行app/console doctrine:migrations:diff时,即使我已经迁移过了,它仍然会生成新的迁移,并且内容总是相同的。例如:
$this->addSql('ALTER TABLE Availability CHANGE start start DATETIME NOT NULL, CHANGE end end DATETIME NOT NULL, CHANGE rrule rrule LONGTEXT DEFAULT NULL, CHANGE created created DATETIME NOT NULL, CHANGE updated updated DATETIME NOT NULL');
1个回答

14

以下是来自于该错误报告的Steve Müller的回复:http://www.doctrine-project.org/jira/browse/DBAL-1085

我认为你需要将你的自定义类型标记为需要SQL注释,否则模式管理器无法区分DateTime类型和你的自定义类型,因为两者都映射到相同的本机SQL类型。

请参见此处: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Types/Type.php#L327-L340

您需要在自定义类型实现中添加以下内容:

/**
 * {@inheritdoc}
 */
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
    return true;
}

我认为可能需要给你的自定义类型取一个独特的名称,例如:

/**
 * {@inheritdoc}
 */
public function getName()
{
    return 'datetime_utc';
}

这些特性已在 doctrine >=2.3 中实现。


1
注意:添加 requiresSQLCommentHint 不会自动解决问题。Diff 将忽略此更改。您必须手动添加注释。 我已为此创建了一个工单:http://www.doctrine-project.org/jira/browse/DBAL-1193 - vbence
@vbence的链接已经失效了,你知道那个bug是否已经修复了吗? - Jose Celano
@vence,我该如何“手动添加评论”?我的意思是,我需要在评论中输入哪些文本? - Jose Celano
我在这里找到了解决方案:https://blog.vandenbrand.org/2015/06/25/creating-a-custom-doctrine-dbal-type-the-right-way/。您必须将此文本添加到列注释中:(DC2Type:CarbonDateTime),其中CarbonDateTime是您定义的自定义DBAL类型的名称。我在GutHub的DBAL库中打开了一个新问题:https://github.com/doctrine/dbal/issues/2506 - Jose Celano
@josecelano 的问题已迁移到 GitHub。新的 URL:https://github.com/doctrine/dbal/issues/1137 - vbence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接