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

除此之外,一切都很好。数据库中的字段是正确的。为什么学说不断更新相同的数据是有原因的吗?

4

4 回答 4

13

您必须覆盖该方法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;
    }
}

资料来源:使用专栏评论进行进一步的学说类型推断

于 2015-01-28T10:12:35.057 回答
4

有另一种方法可以使用配置来做到这一点。

配置.yml:

doctrine:
    dbal:
        types: { money: My\SuperBundle\Types\Money }

    connections:
        your_connection_name:
            mapping_types: { money: money }

资料来源:

于 2013-07-05T14:30:12.250 回答
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 抱怨模式差异。

于 2013-03-29T12:05:59.097 回答
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

我希望这可以帮助某人。

于 2016-07-22T15:07:35.423 回答