我正在使用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作为表示,因此我认为我也可以使用它。
答案 0 :(得分:2)
这是因为学说类型转换。在持久化之前,doctrine会使用属性的值并使用您在列注释中指定的type
将它们转换为SQL值。由于您用于价格属性的类型是string
,因此doctrine正在尝试将Money对象转换为字符串。
你有很多选择可以解决这个问题,其中一些很简单,另一些则没那么多。
简单但不理想:创建一个将从原始类扩展的新Money类,并创建__toString
方法。这将解决您持久存在的问题,但您从db获取的属性将是字符串,而不是对象。如果您想改进它,请在您的setter中添加一些自定义逻辑,以便您可以从该值创建一个货币实例。简单,但很脏。
中等复杂,但可能不是您需要的:您需要使用doctrine custom type。真的不是那么难。人们对此感到害怕,但跳进the docs你会发现它有多简单。它基本上包括创建一个类型,如“money”,其中包含有关在持久保存该类型属性之前要执行的操作的说明,以及从db中获取值后要执行的操作。因此,您仍然将其保存为数据库中的字符串,但您也将控制提取,从而能够创建Money实例。现在,根据您的金钱类别的结构,这可能不是您所需要的。
可能是你最好的选择:我想你的金钱类不仅具有实际价值,而且可能是货币类型的财产。如果是这种情况,可能Doctrine Embeddable是您最好的解决方案。有了它,您将能够将实际值和货币代码分开作为数据库中的单独字段。将您的money类映射为Doctrine Embeddable(因为是一个存在于域逻辑之外的类,在供应商中,您将不得不使用yaml或xml,而不是注释)。从db中获取对象时,它将是Money类的一个实例。但要实现这一点,您需要具有属性访问组件可以使用的适当的getter和setter。关于嵌入式的最好的事情是,它们可以与其他实体重复使用。
希望这些信息有帮助!快乐的编码!