Pregunta

Estoy usando solo la parte de Doctrina de Doctrina para mi proyecto. Así que tengo que preocuparme por el mapeo. Descubrí que la doctrina remota los tipos de bases de datos a un tipo genérico de PHP, ya que puede leer aquí [1].

Ahora me encontré con el hecho de que la doctrina mapea el tipo DB Tinyint (4) a Boolean. Según el manual MySQL, solo Tinyint (1) es equivalente a Boolean [2]. Dado que mi proyecto es un legado que me gusta pasar de MySQLI a Doctrine, necesito seguir los tipos nativos de DB.

¿Mi pregunta es ahora cómo obtengo el tipo de DB de Doctrina nativa?

Gracias de antemano por su ayuda.

Stefano

[1] http:// docs .doctrine-project.org / Projects / Doctrine-Dbal / ES / Último / Referencia / TypeS.html [2] http://dev.mysql.com/ DOC / REFMAN / 5.0 / EN / NUMÉRICO-TIPO-DESCRIPCIÓN GENERAL.HTML

¿Fue útil?

Solución

Me opongo por un informe en Doctrine Neight Tracker para averiguar por qué la doctrina funciona así.La respuesta es simple:

La longitud de Tinyint no dice nada sobre el tamaño del valor que podría ser almacenado.Es en cualquier caso de 1 byte, pero afecta a los ceros de llenado en caso de que use esta opción para su campo.

Doctrine mapea su propio tipo booleano al tipo MySQL Tinyint porque MySQL no proporciona un tipo de booleano propio.

Para obtener más información, puede leer más en el boleto:

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

Otros consejos

Para aquellos que mapean a Legacy MySQL DB a la doctrina, he encontrado una solución para un problema común que es fácil de perder cuando se trata de Tinyint (4)

tl; dr

Cambiar default: '1' en mapeo de campo a

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

versión larga

Tuve la siguiente estructura de DB en Legacy DB, note tinyint (4) en la columna is_active

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

Después de ejecutar los siguientes comandos

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

y luego mientras ejecuta php app/console doctrine:schema:update --dump-sql Terminé con DIFF mientras

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

No pude hacer ninguna modificación con la base de datos existente (pero incluso hacerlo no resolvió el problema, todavía estaba recibiendo esta diferencia)

Mapeo YML tenía la siguiente definición de campo

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

He intentado con

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

Sin éxito, luego siguiendo una regla muy común en la programación "Si realmente no es nada malo con el código, entonces el problema está en otro lugar" encontré la solución

solución

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

Ahora, incluso con el uso de simplemente type: boolean, reconoce a Tinyint (4) correctamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top