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

Était-ce utile?

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:

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

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-sqlJe 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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top