2012-09-06 29 views
1

我们正在考虑将我们的数据库代码在php中迁移到Doctrine2。在我们看来,我们希望做的大部分事情都可以通过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。

回答

0

到目前为止,我不认为你可以通过mapped superclasses来实现。

但是,你可以使用学说结果集映射中的原生SQL:

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

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

+0

我认为你的意思是这个部分http://docs.doctrine-project.org/en/latest/reference/native-sql.html#named-native-query? Doctrine2是否根据SELECT语句生成INSERT,UPDATE和DELETE语句? –

+0

@munnik我从来没有使用过这个,只有这个:http://docs.doctrine-project.org/en/latest/reference/native-sql.html#resultsetmappingbuilder为了检索对象,而不是更新/插入。但是,也许'命名本机查询'可以处理,不知道,你必须测试它。让我知道它是否有效。我很好奇。 –

0

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

用下面的关系: 一个产品有很多ExtraFields(一对多关系),一个ExtraField有许多ExtraFieldValues(一对多关系),以及你的数据库结构。

然后你来定制你的getter/setter方法得到的只有集合的第一个结果(如果事实上你的关系是一对一)...

不知道是不是我不够明确。

+0

这很明显,但不是我们想要的。我们不想'想'代码中的不同表格。只有1个产品类应该有一个动态的属性列表。 –

相关问题