Doctrine自定义类型始终更改表格

11

我添加了一个自定义类型,例如:

namespace My\SuperBundle\Types;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class Money extends Type
{
    const MONEY = 'money';

    public function getSqlDeclaration(
        array $fieldDeclaration,
        AbstractPlatform $platform
    ) {
        return 'DECIMAL(10,2)';
    }

    public function getName()
    {
        return self::MONEY;
    }
}

在我的应用程序引导中:

namespace My\SuperBundle;

use Doctrine\DBAL\Types\Type;
use My\SuperBundle\Types\Money;

class MyBSuperBundle extends Bundle
{
    public function boot()
    {
        //add custom quantity and wight types
        $em = $this->container->get('doctrine.orm.entity_manager');

        if(!Type::hasType(Money::MONEY)) {
            Type::addType(Money::MONEY, 'My\SuperBundle\Types\Money');
        }
    }
}

无论何时我使用以下代码更新数据库:

php app/console doctrine:schema:update --dump-sql

我不断收到以下内容:

ALTER TABLE product_price CHANGE price price DECIMAL(10,2) DEFAULT NULL

除此之外一切都运行得非常好。数据库中的字段是正确的。 Doctrine为什么会一直更新相同的数据?


看起来有一个错误 http://www.doctrine-project.org/jira/browse/DBAL-353?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel - mentalic
1
我将问题标记为不完整,因为无法重现。 - Ocramius
4个回答

14
您需要覆盖方法 requiresSQLCommentHint(AbstractPlatform $platform) 并返回true。这样,Doctrine 将记住自定义类型。
namespace My\SuperBundle\Types;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class Money extends Type
{
    const MONEY = 'money';

    public function getSqlDeclaration(
        array $fieldDeclaration,
        AbstractPlatform $platform
    ) {
        return 'DECIMAL(10,2)';
    }

    public function getName()
    {
        return self::MONEY;
    }

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

来源:利用列注释进行更深入的Doctrine类型推断


4

2
谢谢!请注意,如果您不使用“connections”部分,则可以直接将“mapping_types”条目放在“dbal”部分中。 - tiho

3

你没有告诉DBAL平台你的类型,因此,显然,DBAL模式内省工具无法识别它。要注册该类型,您可以执行以下操作:

use Doctrine\DBAL\Types\Type;
use My\SuperBundle\Types\Money;

class MyBSuperBundle extends Bundle
{
    public function boot()
    {
        /* @var $em \Doctrine\ORM\EntityManager */
        $entityManager = $this->container->get('doctrine.orm.entity_manager');

        if( ! Type::hasType(Money::MONEY)) {
            Type::addType(Money::MONEY, 'My\SuperBundle\Types\Money');
            $entityManager
                ->getConnection()
                ->getDatabasePlatform()
                ->registerDoctrineTypeMapping('decimal', Money::MONEY);
        }
    }
}

这将阻止DBAL抱怨模式差异。


1
它应该没有特定的参数化。 - Ocramius
谢谢你的帮助。不幸的是,它没有起作用。我有三种类型(货币、重量和数量),所有这些类型的结果都是decimal(10,2),可能是这个原因吗?在引导部分,我已经像你建议的那样将所有内容声明为decimal。 - mentalic
你有没有考虑使用内置的数字类型呢? - Ocramius
不要使用自定义类型。 - Ocramius
1
看起来我错过了"http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#custom-mapping-types"中的"You can only map a database type to exactly one Doctrine type. Database vendors that allow to define custom types like PostgreSql can help to overcome this issue.",所以现在没有自定义类型 :( - mentalic
显示剩余3条评论

1

我遇到了与ZF2相关的同样问题。

我通过删除自定义类型名称中的连字符来解决它。

错误:

'doctrine_type_mappings' => [
    'custom-type' => 'custom-type'
],

好的:

'doctrine_type_mappings' => [
    'customtype' => 'customtype'
],

关于在Zend Framework 2中实现的更多细节:https://github.com/doctrine/DoctrineORMModule/blob/master/docs/EXTRAS_ORM.md

希望这能帮助到某些人。


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