Money PHP - 在数据库中持久保存 Money 对象的无损方法
Money PHP - Loseless way to Persist Money Object in Database
我指的是 moneyphp/money 库,我计划在我们的一个项目中使用它来处理货币。文档很棒,只是它没有涉及如何在数据库中持久化。它谈到将货币对象编码为 JSON,但存储字符串使得很难像比较金额或货币那样简单地进行查询。
通过问题,我发现很少有人讨论 Doctrine,而且它是如此特定于 Doctrine,以至于我无法从中受益。
简明扼要地问我的问题:如何在不丢失细节的情况下存储货币对象?我对 Postgresql 感兴趣,但任何关系数据库都可以。
注意: 我读过很多不同的方法来将货币保存在数据库中,他们 differ in how they do。我对使用此特定库的特定方式感兴趣。
在厌烦地阅读了许多不同的话题、帖子等之后,我得出的结论是只有两种方式是可以接受的(请参阅 this question 中的精彩评论):
每次保存到数据库时将所有货币转换为最小单位(例如美分),并在检索时重新转换。
使用具有所需准确性的 DECIMAL/NUMERIC 数据类型(许多人建议在进行正常操作时使用 NUMERIC(15,4),或者在进行货币兑换操作时使用 NUMERIC(15, 6))
当然无论选择什么,都必须加上货币栏。
因为this library (which is not the original when I asked the question), which makes that super easy. Here are explanations from author after I created an issue:
我用第一种方法结束了
I can only tell you that I personally store my monies in the database
as an integer representing the amount in minor units (cents), and
optionally a CHAR(3)
for the currency if the application uses multiple
currencies (otherwise the currency is hardcoded in the app).
You can get the amount in minor units this way, as an integer:
$money->getMinorAmount()->toInt();
And you can retrieve a Money from an integer stored in the database
using:
Money::ofMinor($integerAmount, 'USD');
我指的是 moneyphp/money 库,我计划在我们的一个项目中使用它来处理货币。文档很棒,只是它没有涉及如何在数据库中持久化。它谈到将货币对象编码为 JSON,但存储字符串使得很难像比较金额或货币那样简单地进行查询。
通过问题,我发现很少有人讨论 Doctrine,而且它是如此特定于 Doctrine,以至于我无法从中受益。
简明扼要地问我的问题:如何在不丢失细节的情况下存储货币对象?我对 Postgresql 感兴趣,但任何关系数据库都可以。
注意: 我读过很多不同的方法来将货币保存在数据库中,他们 differ in how they do。我对使用此特定库的特定方式感兴趣。
在厌烦地阅读了许多不同的话题、帖子等之后,我得出的结论是只有两种方式是可以接受的(请参阅 this question 中的精彩评论):
每次保存到数据库时将所有货币转换为最小单位(例如美分),并在检索时重新转换。
使用具有所需准确性的 DECIMAL/NUMERIC 数据类型(许多人建议在进行正常操作时使用 NUMERIC(15,4),或者在进行货币兑换操作时使用 NUMERIC(15, 6))
当然无论选择什么,都必须加上货币栏。
因为this library (which is not the original when I asked the question), which makes that super easy. Here are explanations from author after I created an issue:
我用第一种方法结束了I can only tell you that I personally store my monies in the database as an integer representing the amount in minor units (cents), and optionally a
CHAR(3)
for the currency if the application uses multiple currencies (otherwise the currency is hardcoded in the app).You can get the amount in minor units this way, as an integer:
$money->getMinorAmount()->toInt();
And you can retrieve a Money from an integer stored in the database using:
Money::ofMinor($integerAmount, 'USD');