Php 货币\无法将货币转换为字符串

Php 货币\无法将货币转换为字符串,php,symfony,doctrine,Php,Symfony,Doctrine,我正在使用Money/Money与Symfony和学说,但我不确定应该如何执行映射。目前我使用以下命令,导致此错误消息 错误: Money\Money could not be converted to string /** * @Groups({"group1"}) * @ORM\Column(type="string", nullable=true) * @var Money */ private $price; 映射: Money\Money could not be conv

我正在使用Money/Money与Symfony和学说,但我不确定应该如何执行映射。目前我使用以下命令,导致此错误消息

错误:

Money\Money could not be converted to string
/**
 * @Groups({"group1"})
 * @ORM\Column(type="string", nullable=true)
 * @var Money
 */
private $price;
映射:

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

在内部,Money/Money使用字符串作为表示形式,因此我认为我也可以使用它。

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

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

  • 简单但不是最优的:创建一个新的Money类,该类将从原来的Money类扩展,并创建
    \uu toString
    方法。这将解决您的持久化问题,但您将从db获得的属性将是字符串,而不是对象。如果您想改进这一点,请在setter中添加一些自定义逻辑,以便可以从该值创建货币实例。简单,但肮脏

  • 中等复杂度,但可能不是您需要的:您需要使用。真的没那么难。人们对此感到害怕,但跳入其中,你会发现这是多么简单。它基本上包括创建一个类型,如“money”,其中包含关于在持久化该类型的属性之前要做什么以及从数据库中获取值之后要做什么的原则说明。因此,您仍然可以将其保存为数据库中的字符串,但您还可以控制抓取,从而能够创建Money实例。现在,取决于你的金钱阶层的结构,这可能不是你所需要的

  • 可能是您最好的选择:我认为您的money类不仅具有实际值,而且可能具有货币类型的属性。如果是这样的话,a可能是最好的解决方案。这样,您就可以在数据库中将实际值和货币代码作为单独的字段分开。将您的money类映射为可嵌入的原则(因为它是一个位于域逻辑之外的类,在供应商中,您必须使用yaml或xml,而不是注释)。当从数据库中获取对象时,它将是Money类的一个实例。但要实现这一点,您需要有属性访问组件可以使用的适当的getter和setter。Embeddebles最好的一点是,它们可以与其他实体一起重用

  • 希望这些信息有帮助!快乐编码