Symfony Geld Feldtyp und Lehre
Was ist Ihre Strategie zum speichern von monetären Werten mit der Lehre? Die Symfony-s Geld Feld ist ganz praktisch, aber wie kann man diese Karte Lehre-Säule? Gibt es ein bundle für diese bietet DBAL geben?
float
oder int
Spalte Arten sind unzureichend, weil, wenn Sie sich mit Geld, das Sie beschäftigen sich oft mit der Währung zu. Ich bin mit beiden Felder für diese, aber es ist umständlich zu handhaben manuell.
- Sie benötigen zum speichern von integer-oder Fließkomma-zahlen? Ich denke, dass Sie eine limiter Anzahl von Feld-Typen.
- Es spielt keine Rolle, viel. Ich kann immer divisor option, um Ganzzahlen in Fließkommazahlen. Für jetzt bin ich mit
int
(Betrag) +string
(Währung), aber es ist so umständlich. - Was tun Sie mit der
+
Zeichen? Haben Sie ein Feld für die Menge und ein Feld für die Währung? Wenn Sie die Arbeit mit verschiedenen Währungen, ich schlage vor, Sie fügen Sie einen Hinweis in Ihrer Frage, weil es macht es ein bisschen komplizierter, als wenn Sie nur eine Währung. - Die
+
Zeichen spielt keine Rolle, da Betrag gespeichert ist, alsint
- es kann positiv oder negativen Wert. Zumindest in meinem Fall, obwohl es das gleiche mit floats.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erwägen Sie die Verwendung der
decimal
Typ:Beachten Sie, dass es gibt Währungen, die drei Nachkommastellen. Wenn Sie beabsichtigen, zu verwenden, solche Währungen, die
scale
parameter werden sollte3
. Wenn Sie beabsichtigen zu mischen Währungen mit zwei und drei Nachkommastellen, fügen Sie ein trailing0
wenn es nur zwei Nachkommastellen.Achtung:
$price
wird ein string in PHP. Sie können entweder werfe esfloat
oder multiplizieren Sie mit 100 (oder 1000, - im Falle von Währungen mit drei Nachkommastellen) und werfe esint
.Die Währung selbst ist ein eigenes Feld; es kann ein string mit drei Buchstaben Währungscode. Oder – die saubere Art und Weise – Sie können erstellen Sie eine Tabelle mit allen Währungen, die Sie verwenden, und erstellen Sie dann eine
ManyToOne
Bezug auf die Währung Eintrag.decimal
geben! PHP kann nicht vertreten Dezimalstellen genau, das ist definitiv ein problem, wenn es um Geld geht! Immer speichern Geld in die kleinste Einheit (Cent, pence, etc.).echo "<?php var_dump((.1 + .1 + .1 === .3));" | php
Empfehle ich ein Wert-Objekt wie Money\Das Geld.
Definieren Sie einen eigenen Bereich geben, so lange wie Sie sagen, die Lehre, wie Sie damit umgehen können. Zu erklären, das ich aus einem "shop" und "Ordnung", wo "Geld"-ValueObject genutzt wird.
Beginnen, müssen wir eine Entität und einer anderen ValueObject, das verwendet wird in der Entität:
Order.php:
Money.php:
So weit nichts besonderes. Die "Magie" kommt hier:
MoneyType.php:
Dann können Sie den folgenden code verwenden:
Könnten Sie schreiben ein mapper, welche Karten Ihr input kommt von Symfony Geld Feld in eine Geld-ValueObject um dies zu vereinfachen weiter.
Ein paar mehr details sind hier erklärt: http://doctrine-orm.readthedocs.org/en/latest/cookbook/advanced-field-value-conversion-using-custom-mapping-types.html
Ungetestet, aber ich habe dieses Konzept vor und es funktionierte. Lassen Sie mich wissen, wenn Sie Fragen haben.
int
zu lagern Betrag in kleinster Einheit (z.B. Cent bei EUR). Der Nachteil in diesem Fall ist, dass Sie nicht leicht zu filtern oder Sortieren Sie die Daten in der Tabelle durch eine Währung oder Menge. Und das ist der größte show-stopper für mich.MoneyType.php
Beispiel ist non-sense. Es gibt keine FunktionMONEY
in MySQL. Die Sie gerade kopiert Lehre-Beispiel. Es ist irreführend.Ich waren serching für eine Lösung für dieses problem und googeln landete ich auf auf dieser Seite.
Gibt, illustriert die Embeddable Feld vorhanden, da die Lehre 2.5.
Mit so etwas wie dieses, die Sie verwalten können Werte als Geld-diejenigen, die mehr haben, "params".
Beispiel:
Hoffe, das wird helfen.
UPDATE
Schrieb ich eine PHP-Bibliothek, die enthält einige nützliche Objekte Wert.
Es ist auch ein Wert-Objekt zu verwalten monetäre Werte (die wraps der große MoneyPHP Bibliothek) und speichern Sie in der Datenbank mit einem Lehre Art.
Diesen Typ speichert den Wert in die Datenbank in form von
100-EUR
steht für 1 Euro.