Doctrine自定义类型总是改变表

men*_*lic 11 symfony doctrine-orm

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序启动:

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');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我用以下内容更新数据库:

php app/console doctrine:schema:update --dump-sql
Run Code Online (Sandbox Code Playgroud)

我一直得到以下内容:

ALTER TABLE product_price CHANGE price price DECIMAL(10,2) DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)

除此之外,一切都很好.DB中的字段是正确的.是否有理由继续使用相同的数据进行更新?

Kev*_*tel 10

您必须覆盖该方法requiresSQLCommentHint(AbstractPlatform $platform)并返回true.像那样,学说会记住自定义类型.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:使用列注释进一步了解Doctrine Type Inference


Ocr*_*ius 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该可以阻止 DBAL 抱怨架构差异。