gpt4 book ai didi

php - Money\Money 无法转换为字符串

转载 作者:行者123 更新时间:2023-12-05 05:16:27 26 4
gpt4 key购买 nike

我将 Money/Money 与 Symfony 和 doctrine 一起使用,但我不确定应该如何执行映射。目前我使用以下内容,导致此错误消息;

错误:

Money\Money could not be converted to string

映射:

/**
* @Groups({"group1"})
* @ORM\Column(type="string", nullable=true)
* @var Money
*/
private $price;

Money/Money 内部使用 String 作为表示,因此我认为我也可以使用它。

最佳答案

发生这种情况是因为 Doctrine 类型转换。在保留之前,doctrine 获取您的属性值,并使用您在列注释中指定的 type 将它们转换为 SQL 值。由于您用于 price 属性的类型是 string,doctrine 试图将您的 Money 对象转换为字符串。

你有很多选择来解决这个问题,有些很简单,有些则没那么简单。

  1. 简单但不是最优:创建一个新的 Money 类,它将从原始类扩展,并创建 __toString 方法。这将解决您的问题,但您将从数据库中获得的属性将是一个字符串,而不是一个对象。如果您想改进它,请在您的 setter 中放置一些自定义逻辑,以便您可以从该值创建一个 money 实例。简单,但肮脏。

  2. 中等复杂度,但可能不是您需要的:您需要使用 doctrine custom type .真的没有那么难。人们害怕这个,但跳进the docs你会发现它是多么简单。它基本上包括创建一个类型,如“金钱”,其中包含关于在持久化该类型的属性之前要做什么以及从数据库中获取值之后要做什么的 Doctrine 指令。因此,您仍会将其作为字符串保存在数据库中,但您还将控制提取,从而能够创建 Money 实例。现在,根据您的金钱等级结构,这可能不是您所需要的。

  3. 可能是您的最佳选择:我认为您的货币类别不仅具有实际值(value),而且可能是一种货币类型属性。如果是这样的话,可能是一个Doctrine Embeddable是您最好的解决方案。有了它,您将能够将实际值和货币代码分离为数据库中的单独字段。将您的 money 类映射为 Doctrine Embeddable(因为这是一个存在于您的域逻辑之外的类,在供应商中,您将不得不使用 yaml 或 xml,而不是注释)。当从数据库中获取对象时,它将成为 Money 类的一个实例。但要做到这一点,您需要拥有属性访问组件可以使用的适当的 getter 和 setter。可嵌入物的最大好处是它们可以与其他实体一起重复使用。

希望这些信息对您有所帮助!编码愉快!

关于php - Money\Money 无法转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50509593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com