Money PHP - 将 Money 对象保存在数据库中的无损方法
Posted
技术标签:
【中文标题】Money PHP - 将 Money 对象保存在数据库中的无损方法【英文标题】:Money PHP - Loseless way to Persist Money Object in Database 【发布时间】:2018-02-07 10:16:31 【问题描述】:我指的是moneyphp/money 库,我计划在我们的一个项目中使用它来处理货币。文档很棒,只是它没有涉及如何在数据库中持久化。它谈到了将货币对象编码为 JSON,但存储字符串使得查询变得像比较金额或货币一样简单。
通过问题,我发现很少有关于教义的讨论,而且它对教义是如此具体,以至于我无法从中受益。
用简洁的话问我的问题:如何在不丢失细节的情况下存储货币对象?我对 Postgresql 很感兴趣,但是任何关系数据库都可以。
注意:我已经阅读了许多不同的方法来将货币保存在数据库中,他们differ in how they do。对与此特定库一起使用的特定方式感兴趣。
【问题讨论】:
有什么反对分别存储这两个字段的吗?这似乎是最自然的方式。 没有。我没有这个限制。只要存储/检索是无损的,就可以了。唯一的限制是(1)运行查询应该很容易(2)保存和检索数据应该是无损的。 为了方便那些不熟悉库的人,您需要存储哪些确切的属性? 如果分割属性没问题,那么我认为无损存储完全取决于数据库系统。但是检查:moneyphp.org/en/latest/concept.html#integer-limit 意味着不鼓励使用字符串类型以外的任何东西。这意味着在数据库中进行计算可能会出现问题。 我建议两个字符串字段(具有适当的长度),而不是在数据库内进行计算。 【参考方案1】:在阅读了许多不同的线程、帖子等之后,我得出的结论是只有两种方式是可以接受的(请参阅 this question 中的优秀 cmets):
每次保存到数据库时将所有货币转换为最小单位(例如美分),并在检索时重新转换。
使用所需精度的 DECIMAL/NUMERIC 数据类型(在进行正常操作时,许多人建议使用 NUMERIC(15,4),如果进行货币兑换操作,则建议使用 NUMERIC(15,6))
当然无论选择什么,都必须加上货币栏目。
因为this library(当我问这个问题时,这不是原来的),我最终选择了第一种方法,这使得这非常容易。以下是我创建issue后作者的解释:
我只能告诉你,我个人将我的资金存储在数据库中 作为一个整数,表示以次要单位(美分)为单位的金额,以及 如果应用程序使用多个货币,则可选
CHAR(3)
货币(否则货币在应用程序中是硬编码的)。您可以通过这种方式以整数形式获得次要单位的金额:
$money->getMinorAmount()->toInt();
您可以从存储在数据库中的整数中检索 Money 使用:
Money::ofMinor($integerAmount, 'USD');
【讨论】:
注意,您的示例代码适用于brick/money,而不是moneyphp/money
;)
我放弃了图书馆有两个原因(1)与对另一个(链接)的友好回应相比,对我打开的问题的严厉回应大致相同。 (2)砖库支持最小转换单位的自动转换,从而简化了事情。我会加粗那部分!以上是关于Money PHP - 将 Money 对象保存在数据库中的无损方法的主要内容,如果未能解决你的问题,请参考以下文章
请问在c# winform中怎么将文本框中的数值保存到数据库中money类型的字段中???
Discord money bot 将用户 ID 保存在 json 文件中。当 Not 重新启动时,它会为每个人创建一个新的(但相同的)ID