2013-03-27 8 views
10

Ho aggiunto un tipo personalizzato come:Dottrina tipo personalizzato alterando sempre tavolo

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

E nel mio stivale applicazione:

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

Tuttavia ogni volta posso aggiornare il database con:

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

Continuo a ricevere il seguente:

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

A parte che tutto funziona super fine. I campi nel DB sono corretti. C'è una ragione per cui la dottrina continua ad aggiornare con gli stessi dati?

+0

Sembra che ci sia un bug http://www.doctrine-project.org/jira/browse/DBAL-353?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel – mentalic

+1

Ho chiuso il problema incompleto perché non era riproducibile. – Ocramius

risposta

3

Non si sta parlando della piattaforma DBAL del proprio tipo, quindi ovviamente le utilità di introspezione dello schema DBAL non sono in grado di riconoscerlo. Per registrare il tipo, si può fare seguente:

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

Questo dovrebbe fermare la DBAL da lamentarsi differenze dello schema.

+0

-> registerDoctrineTypeMapping ('decimal', Money :: MONEY); OR -> registerDoctrineTypeMapping ('decimal (10,2)', Money :: MONEY); ? – mentalic

+1

Dovrebbe essere senza la parametrizzazione specifica. – Ocramius

+0

Grazie per il vostro aiuto. Sfortunatamente non ha funzionato. Ho 3 tipi (denaro, peso e quantità) che risultano tutti al decimale (10,2) potrebbe essere il caso? Nella sezione di avvio ho dichiarato tutto decimale come hai suggerito – mentalic

4

C'è un modo alternativo per farlo usando le configurazioni.

config.yml:

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

    connections: 
     your_connection_name: 
      mapping_types: { money: money } 

Fonti:

+2

Grazie! Solo una nota che se non si utilizza la sezione "connessioni", è possibile inserire la voce "mapping_types" direttamente nella sezione "dbal". – tiho

8

Devi eseguire l'override del metodo requiresSQLCommentHint(AbstractPlatform $platform) e restituire true. In questo modo, la dottrina ricorderà il tipo personalizzato.

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

Fonte: Use column comments for further Doctrine Type Inference

1

Ho avuto lo stesso problema con ZF2.

Ho risolto il problema rimuovendo il trattino nel nome del tipo personalizzato.

Sbagliato:

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

Buono:

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

Maggiori informazioni su implementazione di Zend Framework 2: https://github.com/doctrine/DoctrineORMModule/blob/master/docs/EXTRAS_ORM.md

Spero che questo possa aiutare qualcuno.

Problemi correlati