Mappage de types dans Doctrine 2 DBAL
-
20-12-2019 - |
Question
J'utilise uniquement la partie DBAL de Doctrine pour mon projet.Je dois donc m'occuper moi-même de la cartographie.J'ai compris que Doctrine remappait les types de bases de données en un type PHP générique, comme vous pouvez le lire ici [1].
Maintenant, je suis tombé sur le fait que Doctrine mappe le type DB TinyInt(4) en Boolean.Selon le manuel MySQL, seul TinyInt(1) est équivalent à Boolean [2].Étant donné que mon projet est un projet hérité que j'aime déplacer de mysqli vers Doctrine, je dois m'en tenir aux types de bases de données natifs.
Ma question est maintenant de savoir comment extraire le type de base de données natif de Doctrine ?
Merci d'avance pour votre aide.
Stéfano
[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
La solution
J'offre un rapport dans la doctrine Problème Tracker pour déterminer pourquoi la doctrine fonctionne comme ça.La réponse est simple:
La longueur de Tinyint ne dit rien de la taille de la valeur qui pourrait être stockée.C'est en tout cas 1 octet, mais il effets des zéros de remplissage au cas où vous utilisez cette option pour votre champ.
La doctrine plante son propre type booléen au type MySQL Tinyint, car MySQL ne fournit pas de type booléen.
Pour plus d'informations, vous pouvez lire plus sur le billet:
Autres conseils
Pour ceux qui mappent l'ancienne base de données MySQL à la doctrine, j'ai trouvé une solution à un problème courant qui est facile à manquer lorsqu'il s'agit de TINYINT (4)
TL;DR
changement default: '1'
dans la cartographie sur le terrain pour
is_active:
type: boolean
options:
default: true
nullable: true
Version longue
J'avais la structure de base de données suivante dans l'ancienne base de données, veuillez noter minusculeint(4) dans is_active
colonne
CREATE TABLE IF NOT EXISTS `foo_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
`is_active` tinyint(4) DEFAULT '1',
...
après avoir exécuté les commandes suivantes
php app/console doctrine:mapping:import --force AcmeDemoBundle yml
php app/console doctrine:generate:entities AcmeDemoBundle
et puis en courant php app/console doctrine:schema:update --dump-sql
Je me suis retrouvé avec un diff pendant
ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;
Je n'ai pu apporter aucune modification à la base de données existante (mais même cela n'a pas résolu le problème, j'avais toujours cette différence)
Le mappage yml avait la définition de champ suivante
is_active:
type: boolean
nullable: true
default: '1'
column: is_active
j'ai essayé avec
is_active:
columnDefinition: "TINYINT(4)"
nullable: true
default: '1'
column: is_active
sans succès, puis suivant une règle très courante en programmation "Si vous n'avez vraiment rien de mal avec le code, le problème vient d'ailleurs" j'ai trouvé la solution
Solution
is_active:
type: boolean
options:
default: true
nullable: true
maintenant, même en utilisant simplement type: boolean
il reconnaît correctement tinyint(4)