Doctrine custom type always altering table

后端 未结 4 1832
醉话见心
醉话见心 2021-02-08 08:46

I have added a custom type like:

namespace My\\SuperBundle\\Types;

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

class Mo         


        
相关标签:
4条回答
  • 2021-02-08 09:01

    You are not telling the DBAL platform about your type, so obviously, the DBAL schema introspection utilities cannot recognize it. To register the type, you can do following:

    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);
            }
        }
    }
    

    This should stop the DBAL from complaining about schema differences.

    0 讨论(0)
  • 2021-02-08 09:14

    I had the same problem with ZF2.

    I solved it removing the hyphen in my custom type name.

    Wrong:

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

    Good:

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

    More details about implementation in Zend Framework 2: https://github.com/doctrine/DoctrineORMModule/blob/master/docs/EXTRAS_ORM.md

    I hope this can help someone.

    0 讨论(0)
  • 2021-02-08 09:18

    There's an alternative way to do this using configurations.

    config.yml:

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

    Sources:

    • http://symfony.com/doc/current/cookbook/doctrine/dbal.html#registering-custom-mapping-types
    • https://github.com/sonata-project/SonataUserBundle/issues/103#issuecomment-10083314
    0 讨论(0)
  • 2021-02-08 09:19

    You have to override the method requiresSQLCommentHint(AbstractPlatform $platform) and return true. Like that, doctrine will remember the custom type.

    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;
        }
    }
    

    Source: Use column comments for further Doctrine Type Inference

    0 讨论(0)
提交回复
热议问题