83 votes

Doctrine 2 + valeur non signée

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

144voto

yvoyer Points 4028
/\*\*
 \* @ORM\\Column(name="id", type="integer", options={"unsigned"=true})
 \*/

Il n'y a pas d'endroit dans la documentation (que j'ai vu) qui parle de cela, mais cela fonctionne.

Mise à jour

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

id:
  type: integer
  options:
    unsigned: true

6 votes

Cette opération échouera avec SQLite, qui ne prend en charge que les nombres entiers signés.

0 votes

Ceci est d'ailleurs mentionné dans la documentation docs.doctrine-project.org/projects/doctrine1/fr/latest/fr/ et oui, il s'agit d'une base de données spécifique.

0 votes

@gondo, c'est la doctrine 1.

22voto

gremo Points 7116

Vous pouvez le faire, mais vous perdrez en portabilité. Utiliser columnDefinition et lui attribuer la valeur 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 complète (non portable !) de la colonne. [ ] Cet attribut permet d'utiliser les fonctionnalités avancées de RMDBS. Cependant, vous devez Toutefois, il convient de faire preuve de prudence quant à l'utilisation de cette fonctionnalité et aux conséquences qui en découlent. SchemaTool ne détectera plus correctement les modifications apportées à la colonne si si vous utilisez "columnDefinition".

Référence doctrinale : https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#column

4 votes

La perte de portabilité est inacceptable dans un ORM. Il est préférable d'utiliser une valeur décimale avec une précision de 0.

19voto

FlameStorm Points 31

Documentation Doctrine 1 y Documentation Doctrine 2 a dit que vous pouviez le faire de cette façon :

Annotations PHP :

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

Yaml : ( voir la documentation )

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

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

14voto

Harmon Wood Points 1689

Les décimales permettent d'obtenir des nombres aussi importants et de conserver l'outil SchemaTool, il suffit de régler l'échelle sur 0.

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

Consultez un article complet sur les raisons de ce choix aquí . [EDIT](le lien ne fonctionne pas) J'ai collé l'article ci-dessous. C'est moi qui l'ai écrit de toute façon ;)

des nombres non signés si grands que votre cerveau va exploser ! w/Doctrine 2

Les ORM présentent un problème inhérent. Comment prendre un type de données que seuls certains SGBDR supportent et vous permettre de l'utiliser quand même ? 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 64bit. C'est si difficile que ça ? Mon SGBDR est mySQL, donc tout ce dont j'ai besoin, c'est d'un bigint non signé.

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

Cela semble tout à fait normal 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 complète (non portable !) de la colonne. Cet attribut permet d'utiliser les fonctionnalités avancées de RMDBS. Il convient toutefois de faire preuve de prudence quant à l'utilisation de cette fonctionnalité et aux conséquences qui en découlent. SchemaTool ne détectera plus correctement les modifications apportées à la colonne si vous utilisez "columnDefinition". Fondamentalement, cette fonctionnalité vous permet d'intégrer des éléments non pris en charge dans la définition de la colonne. Rendre les nombres non signés techniquement NON SUPPORTES ! Sans oublier que mes systèmes de déploiement de développement et d'assurance qualité s'appuient fortement sur SchemaTool. Nous pouvons remercier une combinaison de développeurs paresseux chez Doctrine et sqlite3 pour ce petit grain de folie.

Cela m'a immédiatement incité à faire une recherche sur Google. Je n'aime pas réfléchir si ce n'est pas nécessaire. Qu'est-ce que j'ai trouvé ? Tout le monde utilise des varchars. VARCHARS !?!? J'ai failli avoir une crise cardiaque. C'était tout simplement inacceptable.

On entre ainsi dans la décimale. C'est parfait. La taille de stockage est variable et elle est stockée en binaire, de sorte que l'indexation est très rapide. Il suffit de fixer la précision décimale à zéro et voilà. L'ORM peut porter cela sur n'importe quel SGBDR, c'est assez grand pour que nous ne nous préoccupions pas du problème signé/non signé non supporté et c'est rapide comme l'éclair. decimal(20,0) devrait gérer notre taille facebook de dix-huit quintillions quatre cent quarante-six quadrillons sept cent quarante-quatre trillions soixante-treize milliards sept cent neuf millions cinq cent cinquante un mille six cent quinze tout à fait convenablement.

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

0 votes

Le lien vers l'article complet est cassé. Et la réponse ne fonctionne pas ou n'a pas de sens sans ce lien. Pourriez-vous, s'il vous plaît, donner des précisions ou réparer le lien ?

0 votes

@PutzKipa J'ai collé l'autre article que j'avais écrit au bas de cette réponse.

0 votes

Je pense que l'échelle et la précision sont inversées. Il faudrait /** @Column(type="decimal", scale=0, precision=20, nullable=false) */

8voto

czachor Points 881

Utilisation des attributs (PHP >= 8, Doctrine >= 2.9) :

use Doctrine\ORM\Mapping as ORM;

/// ...

#[ORM\Column(type: 'integer', options: [
    "unsigned" => true
])]

Source : https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/reference/attributes-reference.html#column

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X