在一个项目中,我有一个通用的Meta
表,任何其他表都可以用来存储其他数据。
Meta表有一对(target_type,target_id)列,它们引用外部表和元条目所涉及的外键。
e.g。
Meta的架构如下所示:
<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>
我知道我可以使用外键来设置驴表中的关系 Meta 表,如下所示:
<table name="donkeys" phpName="Donkey">
/* ... */
<foreign-key foreignTable="meta">
<reference local="id" foreign="target_id"/>
</foreign-key>
</table>
但这并不能完全满足target_type
在该关系中donkeys
应设置的附加条件。
所以$ donkey-&gt; getMeta()实际上可能会返回与驴子无关的元信息!
我看不到在架构中的外键声明中设置附加条件的方法。 这是正确的吗?
我认为继承可以解决这个问题,所以我将Meta模式更改为:
<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>
是否有办法与推进模式建立这种关系?
答案 0 :(得分:1)
不幸的是,没有。我已经实现了与你相同的设置,并且我已经向Propel的创建者询问了同样的事情(他对我没有一个好的答案)。我能做的最好的事情是为所涉及的各种实体覆盖/添加一些方法到* Query类。