2013-03-27 25 views
10

Dodałem typ niestandardowy odczuwalna:Doktryna niestandardowy typ zawsze zmieniając tabelę

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

iw moim bagażniku Zastosowanie:

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

Jednak każdym razem zaktualizować bazę danych z:

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

wciąż otrzymuję następujący:

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

Poza tym wszystko działa bardzo dobrze. Pola w DB są poprawne. Czy istnieje powód, dla którego doktryna utrzymuje aktualizację z tymi samymi danymi?

+0

Wygląda na to, że jest błąd http://www.doctrine-project.org/jira/browse/DBAL-353?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel – mentalic

+1

Zamknęłam problem jako niekompletne, ponieważ nie było odtwarzalne. – Ocramius

Odpowiedz

3

Nie mówisz o platformie DBAL o twoim typie, więc oczywiście narzędzia introspekcji DBAL schematu nie mogą jej rozpoznać. Aby zarejestrować typ, można wykonać następujące czynności:

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

ta powinna zatrzymać DBAL z sędzią o różnicach schematu.

+0

-> registerDoctrineTypeMapping ('decimal', Money :: MONEY); LUB -> registerDoctrineTypeMapping ('dziesiętne (10,2)', Money :: MONEY); ? – mentalic

+1

Powinno być bez specyficznej parametryzacji. – Ocramius

+0

Dziękuję za pomoc. Niestety to nie wystarczyło. Mam 3 typy (pieniądze, waga i ilość), z których wszystkie mogą być dziesiętne (10,2)? W sekcji rozruchowej zadeklarowałem wszystko jako dziesiętne, zgodnie z sugestią. – mentalic

4

Istnieje alternatywny sposób wykonania tego przy użyciu konfiguracji.

config.yml:

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

    connections: 
     your_connection_name: 
      mapping_types: { money: money } 

Źródła:

+2

Dzięki! Tylko uwaga, że ​​jeśli nie używasz sekcji "połączeń", możesz umieścić wpis "mapping_types" bezpośrednio w sekcji "dbal". – tiho

8

Trzeba zastąpić metodę requiresSQLCommentHint(AbstractPlatform $platform) i powrócić true. W ten sposób doktryna zapamięta niestandardowy typ.

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

Źródło: Use column comments for further Doctrine Type Inference

1

miałem ten sam problem z ZF2.

Rozwiązałem to usuwając łącznik w mojej nazwie niestandardowego typu.

Źle:

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

Dobre: ​​

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

Więcej szczegółów na temat realizacji w Zend Framework 2: https://github.com/doctrine/DoctrineORMModule/blob/master/docs/EXTRAS_ORM.md

Mam nadzieję, że może to komuś pomóc.

Powiązane problemy