1

我们目前正在考虑将 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

ETC

我们的产品有不同的用户,他们都有不同的额外产品属性。所以我们有一个 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。

4

2 回答 2

0

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

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

然后您必须自定义您的 getter/setter 以仅获得集合的第一个结果(如果实际上您的关系是一对一的)...

不知道我说得够不够清楚。

于 2012-09-06T10:02:19.783 回答
0

到目前为止,我认为您无法使用映射的超类来实现这一点。

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

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

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

于 2012-09-06T10:17:10.240 回答