2012-02-28 80 views
1

在一个项目中,我有一个通用的Meta表,其他表可以使用任何其他表来存储其他数据。有没有办法在propel中使用单个继承表作为外键表?

元表具有一个引用外部表和外部元素的元素的列对(target_type,target_id)。

例如

  • 为用户表的元条目将具有(TARGET_TYPE,target_id)=( '用户',53)
  • 的驴表A中的元条目将具有(TARGET_TYPE,target_id)=( '驴' 25)

梅塔的模式是这样的:

<table name="meta" phpName="Meta"> 
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
    <column name="target_id" type="integer" required="true" /> 
    <column name="target_type" type="varchar" size="50" required="true" /> 
    <column name="code" type="varchar" size="50" required="true" /> 
    <column name="value" type="varchar" required="true" /> 
</table> 

我知道我可以使用外键设置在驴表关系到表像这样:

<table name="donkeys" phpName="Donkey"> 
    /* ... */ 
    <foreign-key foreignTable="meta"> 
     <reference local="id" foreign="target_id"/> 
    </foreign-key> 
</table> 

但是,这并不满足要附加条件,即target_type应该在这种关系被设定为donkeys

那么$ donkey-> getMeta()实际上可能会返回与驴无关的元信息!

我看不到在模式中的外键声明中设置附加条件的方法。 这是正确的吗?

我想,也许继承可以解决这个问题,所以我改变了元模式这样:

<table name="meta" phpName="Meta"> 
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
    <column name="target_id" type="integer" required="true" /> 
    <column name="target_type" type="varchar" size="50" required="true" inheritance="single"> 
     <inheritance key="users" class="UserMeta"/> 
     <inheritance key="donkeys" class="DonkeyMeta"/> 
    </column> 
    <column name="code" type="varchar" size="50" required="true" /> 
    <column name="value" type="varchar" required="true" /> 
</table> 

但我不能似乎能够设置外键关系链接到继承的子类DonkeyMeta。

即这不起作用:

<table name="donkeys" phpName="Donkey"> 
    /* ... */ 
    <foreign-key foreignTable="DonkeyMeta"> 
     <reference local="id" foreign="target_id"/> 
    </foreign-key> 
</table> 

是有办法做到这种关系与推进的模式?

回答

1

不幸的是,没有。我已经实现了与您相同的设置,并且我已经向Propel的创建者询问了同样的事情(并且他对我没有很好的答案)。我能做的最好的方法是为涉及的各种实体覆盖/添加一些方法到* Query类。

+0

好点,这个问题也对测试和夹具有巨大的影响,如[这里描述](http://stackoverflow.com/questions/15536​​617/propel-foreign-key-reference-to-derived-class-in - 单表继承) – 2013-03-20 23:24:28

相关问题