2012-02-28 82 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

相關問題