将表行中的数据映射到Doctrine2对象中的属性

时间:2012-09-06 09:56:24

标签: php hibernate doctrine-orm

我们目前正在考虑将php中的数据库代码迁移到Doctrine2。在我们看来,我们希望做的大多数事情都可以通过Doctrine2实现。只有一件事我们不确定它是否可能以及我们应该如何做到这一点。我们的数据库模型现在无法更改,因为另一个项目使用的是同一个数据库。我们一次只能改变一件事。当然,我们也很好奇如何改进数据库模型,但这不是我们主要关注的问题。

问题是这样的。我们有一个产品表,其中包含以下基本产品信息:

[product_id | code         | name          | description              | price]
 4            AS84GD         Steel brush    Strong steel brush.....     25.50
 28           HDD21N         Sand paper     Sand paper for wood.....     0.40

我们的产品有不同的用户,这些用户具有不同的额外产品属性。所以我们有一个product_extra_field表,看起来像这样:

[extra_field_id | name]
 3                weight
 4                color
 9                supplier

最后是带有额外数据的表product_extra_field_data

[product_id | extra_field_id | value]
 4            3                280
 4            4                brown
 4            9                company_x
 28           3                3
 28           4                yellow
 28           9                company_y

我们如何正确使用必要的Doctrine2代码将这些数据放在一个对象中,这样我们就可以拥有这样的对象?

[Product]
Id : 4
Code : AS84GD
Name : Steel brush
Description : Strong steel brush.....
Price : 25.50
Weight : 280
Color : brown
Supplier : company_x

我为Hibernate添加了一个标签,因为我可以读取(N)Hibernate代码并将这些想法转换为Doctrine2。

2 个答案:

答案 0 :(得分:0)

您可以创建几个类: - 产品 - ExtraField - ExtraFieldValue

具有以下关系: 一个产品有许多ExtraFields(一对多关系),一个ExtraField有许多ExtraFieldValues(一对多关系),这与您的数据库结构有关。

然后你必须自定义你的getter / setter才能获得集合的第一个结果(如果事实上你的关系是One To One)......

不知道我是否足够清楚。

答案 1 :(得分:0)

到目前为止,我认为你不能用mapped superclasses实现这一点。

但是,您可以在学说结果集映射中使用本机SQL:

http://docs.doctrine-project.org/en/latest/reference/native-sql.html

这是在对象和关系数据之间进行映射时的缺点之一,我的意思是,如果你真的只想要一个实体而不是从数据库中复制关系。