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