Symfony argent type de champ et de la doctrine
Quelle est votre stratégie pour stocker des valeurs monétaires avec la Doctrine? Symfony est de l'argent champ est assez pratique, mais comment faire pour la carte ce qui est de la Doctrine de la colonne? Est-il un bundle pour ce qui fournit DBAL type?
float
ou int
types de colonnes sont insuffisantes parce que quand vous avez affaire avec de l'argent vous traitent souvent de la monnaie aussi. Je suis l'aide de deux champs, mais c'est délicat à traiter manuellement.
- Avez-vous besoin pour stocker des entiers ou des nombres décimaux? Je pense que vous aurez un limiteur nombre de types de champs.
- Il n'a pas beaucoup d'importance. Je peux toujours utiliser diviseur option pour activer l'ints dans les flotteurs. Pour l'instant, je suis en utilisant
int
(montant) +string
(monnaie) mais il est tellement maladroit. - Que faites-vous avec le
+
signe? Avez-vous un champ pour le montant et un champ pour la monnaie? Si vous avez à travailler avec des devises différentes, je vous suggère d'ajouter une note à votre question, car cela rend les choses un peu plus complexe que si vous avez une seule monnaie. - Le
+
signe n'a pas d'importance puisque la quantité est stockée en tant queint
- il peut être positif ou négatif de la valeur. Au moins dans mon cas, même si c'est la même chose avec des flotteurs.
Vous devez vous connecter pour publier un commentaire.
Envisager l'utilisation de la
decimal
type:Remarque qu'il y a des monnaies qui ont trois positions décimales. Si vous avez l'intention d'utiliser ces monnaies, le
scale
paramètre doit être3
. Si vous avez l'intention de mélanger les monnaies de deux à trois positions décimales, ajouter un point0
si il y a seulement deux positions décimales.À l'Attention de:
$price
sera une chaîne de caractères en PHP. Vous pouvez soit lancer àfloat
ou le multiplier avec 100 (ou 1000, dans le cas de monnaies avec trois positions décimales), et de le jeter àint
.La monnaie elle-même est un champ distinct; il peut être une chaîne de caractères avec les trois lettres de la devise. Ou – le propre – vous pouvez créer un tableau avec toutes les monnaies que vous utilisez, puis de créer un
ManyToOne
rapport à la monnaie d'entrée.decimal
type! PHP ne peut pas représenter les décimales de précision qui est certainement un problème quand il s'agit de l'argent! Toujours stocker de l'argent dans l'unité la plus petite (en cents, pence, etc.).echo "<?php var_dump((.1 + .1 + .1 === .3));" | php
Je recommande d'utiliser un objet de valeur comme De L'Argent\Argent.
Vous pouvez définir un champ de type aussi longtemps que vous le dites à la doctrine de la façon de gérer cela. Pour expliquer ce que j'ai fait une "boutique" et "commande" où un "argent"-ValueObject s'habitue.
Pour commencer nous avons besoin d'une Entité et une autre ValueObject, qui est utilisé dans l'entité:
Order.php:
Money.php:
Pour l'instant rien de spécial. La "magie" vient ici:
MoneyType.php:
Ensuite, vous pouvez utiliser le code suivant:
Vous pourriez écrire un mappeur qui correspond à votre entrée en provenance de Symfony de l'argent dans l'Argent ValueObject pour simplifier davantage.
Un couple plus de détails sont expliqués ici: http://doctrine-orm.readthedocs.org/en/latest/cookbook/advanced-field-value-conversion-using-custom-mapping-types.html
Pas testé, mais j'ai utilisé ce concept d'avant et ça a fonctionné. Laissez-moi savoir si vous avez des questions.
int
pour stocker somme dans il est plus petite unité (par exemple cents EUROS). L'inconvénient dans ce cas est que vous ne pouvez pas facilement filtrer ou trier les données dans le tableau par la monnaie ou le montant. Et c'est le plus gros frein pour moi.MoneyType.php
exemple est un non-sens. Il n'y a pas de fonctionMONEY
dans MySQL. Vous venez de copier Doctrine exemple. C'est trompeuse.J'ai été plut pour une solution à ce problème et de recherche sur google je suis tombé sur cette page.
Là, il est illustré à la Intégrable champ disponible depuis la Doctrine 2.5.
Avec quelque chose comme cela, vous pouvez gérer les valeurs monétaires ceux qui ont plus de "params".
Un exemple:
Espère que cela aidera.
Mise à JOUR
J'ai écrit un Bibliothèque PHP qui contient quelques objets de valeur.
Il est également un objet de valeur à gérer des valeurs monétaires (qui encapsule la grande MoneyPHP bibliothèque) et persister en base de données à l'aide d'un La Doctrine de type.
Ce type enregistre la valeur de la base de données sous la forme de
100-EUR
qui se tient pour 1 Euro.