Mapeamento de tipos no Doctrine 2 DBAL
-
20-12-2019 - |
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
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:
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-sql
Acabei 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