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>
是有辦法做到這種關係與推進的模式?
好點,這個問題也對測試和夾具有巨大的影響,如[這裏描述](http://stackoverflow.com/questions/15536617/propel-foreign-key-reference-to-derived-class-in - 單表繼承) – 2013-03-20 23:24:28