2013-05-11 181 views
0

我需要将许多实体映射为一对多到同一个实体主键。symfony2 + doctrine2:映射许多实体加入同一个实体复合主键

为了简便起见,我将尝试semplify一点点:

假设我有一个新闻和产品表需要进行不同的排序,如果显示在网站或iOS应用。我希望只有一个表存储所有表格的订单信息(称为“职位”),因为将来我需要管理其他20个或更多表格。

下面是简化表:

_________ 
|news  | 
--------- 
|id (pk) | 
|title | 
--------- 

_________ 
|product | 
--------- 
|id (pk) | 
|name  | 
--------- 

__________ 
|position | id + table + target are the composite primary key 
---------- 
|id (pk) | can refer to a news.id or to a product.id depending on table field value 
|table(pk) | define if the id refer to a news or to a product 
|target(pk)| can be "web" or "ios" 
|position | an integer 
---------- 

3 possible position records could be: 

id - table - position - target 
1  news  1  web 
1  news  1  ios 
1  product  1  web 

正如你看到的,我可以有相同的ID重复3次。 我知道这有点脏,也许不是最佳实践,但每当我需要添加表格(新闻,艺术家,事件等)时,它会为我节省很多表和实体创建。 我知道使用Doctrine2来满足我的需求的唯一方法是创建一个xxx_position_web和一个xxx_position_ios表以及将来必须管理的每个新表的相关实体。

是否可以使用Symfony2中的Doctrine2实体管理这样的事情。 我发现了一个链接,解释了与我的https://doctrine-orm.readthedocs.org/en/latest/tutorials/composite-primary-keys.html?highlight=composite#identity-through-foreign-entities非常相似的情况,但我无法将其应用于我的情况。

回答

0

查看文档中的Class Table Inheritance

您可以使用位置作为超表新闻产品是鉴别(即你做什么用的表场)。现在,您只需将目标作为复合键添加到映射的超类(位置)上即可。

只要添加一个新的表格,如事件你只需将它们添加到鉴别地图和创建具有附加字段的新模式。

+0

感谢mahok,很好的建议! – 2014-03-04 18:13:32

0

非常感谢您的回答,Class Table Inheritance看起来很有趣。

使用它,我会像

/** @Entity */ 
class News extend Position 
{ 
... 
} 

什么样,如果在我的情况,我需要的关系定位,也具有相同结构的另一个表(可惜这是我的情况,我需要管理一个可见性表)。 我无法让新闻扩展位置和可见度。