web-dev-qa-db-fra.com

Doctrine 2 + valeur non signée

Est-il possible de spécifier un type de colonne de unsigned integer in Doctrine 2?

64
Krzysztof Trzos

Vous pouvez mais vous perdrez la portabilité. Utilisez l'attribut columnDefinition et définissez-le sur integer unsigned. Le code réel dépend de ce que vous utilisez.

columnDefinition: extrait SQL DDL qui commence après le nom de la colonne et spécifie la définition de colonne complète (non portable!). Cet attribut permet d'utiliser des fonctionnalités RMDBS avancées. Cependant, vous devez utiliser attentivement cette fonction et ses conséquences. SchemaTool ne détectera plus correctement les modifications sur la colonne si vous utilisez "columnDefinition".

18
gremo
/** 
 * @ORM\Column (nom = "id", type = "entier", options = {"unsigned" = true}) 
 */

Il n'y a pas de place dans le doc (que j'ai vu) qui en parle, mais ça marche.

Mise à jour

Définition en Yaml (à partir de 2.4 pour la clé primaire)

id:
  type: integer
  options:
    unsigned: true
119
yvoyer

Les décimales permettront de tels nombres et vous permettront de conserver le SchemaTool, il suffit de mettre l'échelle à 0.

<?php
/**
 * @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
 */
Protected $facebookId;

Consultez un article complet sur pourquoi ici . [MODIFIER] (le lien ne fonctionne pas) J'ai collé l'article ci-dessous. Il a été écrit par moi de toute façon;)

des nombres non signés si gros que votre cerveau va exploser! avec Doctrine 2

Les ORM ont un problème inhérent. Comment prendre un type de données uniquement en charge par certains SGBDR et vous permettre de l'utiliser de toute façon. Eh bien, en ce qui concerne Doctrine 2 et les nombres non signés, ils sont devenus un peu paresseux.

Tout ce que je veux faire, c'est stocker mes identifiants Facebook 64 bits. Est-ce difficile? Eh bien, mon SGBDR est mySQL, donc tout ce dont j'ai vraiment besoin est un bigint non signé.

<?php
/**
 * @Column(type="bigint", nullable=false, unique=true, columnDefinition="unsigned")
 */
Protected $facebookId;

Cela semble trouver et dandy jusqu'à ce que vous lisiez ceci:

columnDefinition: extrait SQL DDL qui commence après le nom de la colonne et spécifie la définition de colonne complète (non portable!). Cet attribut permet d'utiliser des fonctionnalités RMDBS avancées. Cependant, vous devez utiliser attentivement cette fonction et ses conséquences. SchemaTool ne détectera plus correctement les modifications sur la colonne si vous utilisez "columnDefinition". Fondamentalement, cette fonctionnalité vous permet de libérer des éléments non pris en charge dans la définition de colonne. Faire des numéros non signés techniquement NON PRIS EN CHARGE! Sans oublier que mes systèmes de déploiement de dev et de QA dépendent fortement du SchemaTool. Nous pouvons remercier une combinaison de développeurs paresseux à Doctrine et sqlite3 pour cette petite pépite de ville folle.

Cela a immédiatement déclenché une recherche Google. Je n'aime pas penser si je n'ai pas à le faire. Qu'ai-je trouvé? Tout le monde utilise des varchars. VARCHARS!?!? J'ai eu une crise cardiaque. C'était tout simplement inacceptable.

Entre donc décimal. C'est parfait. La taille de stockage est variable et elle est stockée en binaire, donc l'indexation est super rapide. Nous venons de mettre la précision décimale à zéro et voilà. L'ORM peut porter cela sur n'importe quel SGBDR, il est assez grand pour que nous ne nous soucions pas du problème signé/non signé non pris en charge et c'est rapide comme l'éclair. décimal (20,0) devrait gérer notre taille facebook de dix-huit quintillions quatre cent quarante-six quadrillions sept cent quarante quatre trillions soixante-treize milliards sept cent neuf millions cinq cent cinquante et un mille six cent quinze.

<?php
/**
 * @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
 */
Protected $facebookId;
13
Harmon Wood

documentation Doctrine 1 et documentation Doctrine 2 dit que vous pouvez le faire de cette façon:

Annotations PHP:

/**
 * @Column(type="integer", name="some_field" options={"unsigned":true})
 */
protected $someField;

Yaml: ( voir documentation )

MyEntity:
  fields:
    someField:
      type: integer
      column: some_field
      options:
        unsigned: true

J'espère que cela aide quelqu'un à gagner du temps;)

8
FlameStorm