Pergunta

Estou usando apenas a parte DBAL do Doctrine para meu projeto.Então eu mesmo tenho que me preocupar com o mapeamento.Eu descobri que o Doctrine remapeia os tipos de banco de dados para um tipo PHP genérico, como você pode ler aqui [1].

Agora me deparei com o fato de que o Doctrine mapeia o tipo de banco de dados TinyInt(4) para Boolean.De acordo com o manual do MySQL, apenas TinyInt(1) é equivalente a Boolean [2].Como meu projeto é legado e gosto de migrar do mysqli para o Doctrine, preciso me ater aos tipos de banco de dados nativos.

Minha pergunta agora é como obtenho o tipo de banco de dados nativo do Doctrine?

Agradeço antecipadamente por sua ajuda.

Stefano

[1] http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html [2] http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html

Foi útil?

Solução

Eu opte por um relatório no rastreador de problemas de doutrina para descobrir por que a doutrina funciona assim.A resposta é simples:

O comprimento do tinyint não diz nada sobre o tamanho do valor que poderia ser armazenado.É em qualquer caso 1 byte, mas afeta os zeros de enchimento no caso de você usar essa opção para o seu campo.

doutrina mapeia seu próprio tipo booleano para o tipo MySQL Tinyint porque o MySQL não fornece um tipo booleano próprio.

Para mais informações, você pode ler mais sobre o ingresso:

http://www.doctrine-project.org/jira/browse/DBAL-781

Outras dicas

Para aqueles que mapeiam o banco de dados mysql legado para a doutrina, encontrei uma solução para problemas comuns que são fáceis de perder ao lidar com TINYINT(4)

DR

mudar default: '1' no mapeamento de campo para

is_active:
    type: boolean
    options:
        default: true
    nullable: true

Versão longa

Eu tinha a seguinte estrutura de banco de dados no banco de dados legado, observe minúsculoint(4) em is_active coluna

CREATE TABLE IF NOT EXISTS `foo_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
...
  `is_active` tinyint(4) DEFAULT '1',
...

depois de executar os seguintes comandos

php app/console doctrine:mapping:import --force AcmeDemoBundle yml
php app/console doctrine:generate:entities AcmeDemoBundle

e então enquanto corre php app/console doctrine:schema:update --dump-sqlAcabei com diff enquanto

ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;

Não consegui fazer nenhuma modificação no banco de dados existente (mas mesmo fazendo isso não resolveu o problema, ainda estava recebendo essa diferença)

o mapeamento yml tinha a seguinte definição de campo

is_active:
    type: boolean
    nullable: true
    default: '1'
    column: is_active

Eu tentei com

is_active:
    columnDefinition: "TINYINT(4)"
    nullable: true
    default: '1'
    column: is_active

sem sucesso, seguindo então uma regra muito comum em programação "Se você realmente não fez nada de errado com o código, o problema está em outro lugar" Eu encontrei a solução

Solução

is_active:
    type: boolean
    options:
        default: true
    nullable: true

agora, mesmo usando simplesmente type: boolean ele reconhece tinyint(4) corretamente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top