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 中的精彩评论):

  1. 每次保存到数据库时将所有货币转换为最小单位(例如美分),并在检索时重新转换。

  2. 使用具有所需准确性的 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');