Money \ Money无法转换为字符串

时间:2018-05-24 12:34:00

标签: php symfony doctrine

我正在使用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作为表示,因此我认为我也可以使用它。

1 个答案:

答案 0 :(得分:2)

这是因为学说类型转换。在持久化之前,doctrine会使用属性的值并使用您在列注释中指定的type将它们转换为SQL值。由于您用于价格属性的类型是string,因此doctrine正在尝试将Money对象转换为字符串。

你有很多选择可以解决这个问题,其中一些很简单,另一些则没那么多。

  1. 简单但不理想:创建一个将从原始类扩展的新Money类,并创建__toString方法。这将解决您持久存在的问题,但您从db获取的属性将是字符串,而不是对象。如果您想改进它,请在您的setter中添加一些自定义逻辑,以便您可以从该值创建一个货币实例。简单,但很脏。

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

  3. 可能是你最好的选择:我想你的金钱类不仅具有实际价值,而且可能是货币类型的财产。如果是这种情况,可能Doctrine Embeddable是您最好的解决方案。有了它,您将能够将实际值和货币代码分开作为数据库中的单独字段。将您的money类映射为Doctrine Embeddable(因为是一个存在于域逻辑之外的类,在供应商中,您将不得不使用yaml或xml,而不是注释)。从db中获取对象时,它将是Money类的一个实例。但要实现这一点,您需要具有属性访问组件可以使用的适当的getter和setter。关于嵌入式的最好的事情是,它们可以与其他实体重复使用。

  4. 希望这些信息有帮助!快乐的编码!