我们目前正在考虑将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。
答案 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
这是在对象和关系数据之间进行映射时的缺点之一,我的意思是,如果你真的只想要一个实体而不是从数据库中复制关系。